Patching Golang Monkey pour le code non modifiable
Dans Go, l'absence de modification des objets d'exécution pose un défi pour tester du code fortement interconnecté et manquant de dépendance programmation d'injection ou d'interface. Pour contourner cette limitation, envisagez d'utiliser l'approche suivante :
Création d'une interface Wrapper moqueuse
Définissez votre propre interface qui encapsule les structures d'origine. Par exemple :
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
Utilisation d'une structure d'adaptateur
Implémentez l'interface wrapper dans une nouvelle structure qui adapte l'implémentation de la structure d'origine :
type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
Test avec le Wrapper
Vous pouvez moquez-vous maintenant de la structure Concrete dans les tests unitaires car elle adhère à une interface :
// Mock Concrete mock := &MockMyInterface{} c := Concrete{mock} // Call mock method err := c.DoSomething(10)
Intégrer le type d'origine
Comme suggéré par @elithrar, vous pouvez également intégrer le type d'origine pour se moquer sélectivement uniquement des méthodes nécessaires :
type Concrete struct { *somepackage.Client }
Dans ce cas, vous pouvez toujours accéder à l'implémentation d'origine des méthodes qui pas besoin de se moquer :
c := Concrete{&somepackage.Client{}} c.DoSomethingNotNeedingMocking() // Calls the original implementation
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!