Heim >Backend-Entwicklung >Golang >Wie verspotte ich Strukturmethodenaufrufe in Go-Tests ohne Schnittstellen?

Wie verspotte ich Strukturmethodenaufrufe in Go-Tests ohne Schnittstellen?

Susan Sarandon
Susan SarandonOriginal
2024-12-09 18:57:26373Durchsuche

How to Mock Struct Method Calls in Go Tests Without Interfaces?

Methodenaufrufe von Strukturen in Go-Testfällen verspotten

Problem:

Wie man verspottet ein Methodenaufruf einer Struktur in einem Go-Testfall, ohne Schnittstellen in der Quelle einzuführen Code?

Codebeispiel:

type A struct {}

func (a *A) perfom(string){
...
...
..
} 

var s := A{}
func invoke(url string){
   out := s.perfom(url)
   ...
   ...
} 

Antwort:

Um einen Methodenaufruf einer Struktur zu verspotten, eins Der Ansatz besteht darin, ein Scheinobjekt zu verwenden.

Lösung mit Mock Objekt:

  1. Erstellen Sie eine Performer-Schnittstelle, die die zu verspottende Methode definiert.
  2. Erstellen Sie eine echte Implementierung A der Performer-Schnittstelle.
  3. Erstellen Sie eine Scheinimplementierung AMock der Performer-Schnittstelle.
  4. Übergeben Sie die Scheinimplementierung an die Aufruffunktion im Test Fall.

Beispielcode:

type Performer interface {
    perform()
}

type A struct {}

func (a *A) perform() {
    fmt.Println("real method")
}

type AMock struct {}

func (a *AMock) perform () {
    fmt.Println("mocked method")
}

func caller(p Performer) {
    p.perform()
}

Injizieren Sie im Testfall die Scheinimplementierung in die Aufruffunktion:

func TestCallerMock(t *testing.T) {
    mock := &AMock{}
    caller(mock)
}

Fügen Sie im echten Code die echte Implementierung in die Aufruffunktion ein:

func RealInvoke(url string) {
    a := &A{}
    out := a.perform(url)
}

Das obige ist der detaillierte Inhalt vonWie verspotte ich Strukturmethodenaufrufe in Go-Tests ohne Schnittstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn