Heim > Backend-Entwicklung > Golang > Wie kann ich Funktionen in Go effektiv verspotten?

Wie kann ich Funktionen in Go effektiv verspotten?

Linda Hamilton
Freigeben: 2024-12-06 21:23:14
Original
450 Leute haben es durchsucht

How Can I Effectively Mock Functions in Go?

Verspotten von Funktionen in Golang

Einführung

In Go Verspotten einer Funktion, die für einen konkreten Typ deklariert ist, wie func F() {} und func (T) M() {}, ist nicht möglich. Es gibt jedoch auch andere Ansätze, um eine ähnliche Funktionalität zu erreichen.

Verspotten von Funktionswerten

Go ermöglicht das Verspotten von Funktionswerten, unabhängig davon, ob sie in Variablen, als Felder in einer Struktur oder als gespeichert sind Parameter, die an andere Funktionen übergeben werden. Betrachten Sie zum Beispiel Folgendes:

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())
Nach dem Login kopieren

In allen drei Fällen ist Fn verspottbar.

Mocking-Schnittstellen

Ein bevorzugterer Ansatz zum Verspotten in Go ist die Verwendung Schnittstellen. Zum Beispiel:

type ProductRepository interface {
    GetProductById(DB *sql.DB, ID int) (p Product, err error)
}

// The real implementer
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// The mock implementer
type ProductRepositoryMock struct{}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}
Nach dem Login kopieren

Jeder Code, der auf ProductRepository basiert, kann jetzt ProductStore in normalen Szenarien und ProductRepositoryMock während des Tests verwenden.

Mocking-Schnittstellen für *sql.DB

Andere Eine Möglichkeit zum Verspotten, die es ermöglicht, Ihre vorhandenen Funktionsdeklarationen beizubehalten, besteht darin, eine Schnittstelle zu definieren, die die Methoden von *sql.DB nachahmt, und diese zu verwenden stattdessen. Zum Beispiel:

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // Only declare methods that are actually used.
}

type DBMock struct{}

func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) {
    // ...
}

func GetProductByName(DB DBIface, name string) (p Product, err error) {
    ...
}
Nach dem Login kopieren

Mit diesem Ansatz wird der DB-Parameter für GetProductByName verspottbar.

Das obige ist der detaillierte Inhalt vonWie kann ich Funktionen in Go effektiv verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage