Maison >développement back-end >Golang >Comment puis-je me moquer du code Go non modifiable à des fins de test ?

Comment puis-je me moquer du code Go non modifiable à des fins de test ?

DDD
DDDoriginal
2024-12-09 17:31:17444parcourir

How Can I Mock Unmodifiable Go Code for Testing?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn