Heim Backend-Entwicklung Golang Besprechen Sie die Verwendung von Mock in Golang

Besprechen Sie die Verwendung von Mock in Golang

Apr 23, 2023 pm 07:29 PM

Golang ist eine statisch typisierte Open-Source-Programmiersprache, die von immer mehr Entwicklern begrüßt und geliebt wird. Beim Schreiben von Testcode ist es häufig erforderlich, Scheindaten zu verarbeiten. In diesem Artikel befassen wir uns mit der Verwendung von Mock in Golang und der Verarbeitung von Mock-Daten in verschiedenen Szenarien.

1. Warum ist Mocking erforderlich? , Nachrichtenwarteschlangen usw.) Code. Dies erfordert, dass wir mithilfe der Mocking-Technologie die Antwortergebnisse dieser abhängigen Dienste simulieren, um sicherzustellen, dass der Testcode unabhängig und schnell ausgeführt werden kann.

Darüber hinaus kann Mocking auch zum Testen der Randbedingungen des Codes (z. B. ungewöhnliche Situationen, z. B. nicht den Anforderungen entsprechende Eingabedaten usw.) verwendet werden, um die Robustheit und Zuverlässigkeit des Codes zu verbessern .

2. Mocking-Tools in Golang

Es gibt viele Mocking-Tools zur Auswahl in Golang, einige der beliebtesten Tools sind:

# 🎜🎜#testify: Bietet Spott- und Behauptungsfunktionen, sehr einfach zu verwenden. Es kann zur Simulation gängiger Datenquellen und -ausgaben wie Datenbanken, HTTP-Anfragen und anderer Dienste verwendet werden.

    Mockery: Relativ gesehen ist dieses Tool leichter. Es kann Mock-Code schnell und genau generieren und unterstützt die Mocking-Funktion zur Laufzeit. Darüber hinaus unterstützt Mockery die Ausgabe von Vorlagen beim Generieren von Mock-Code, was Benutzern mehr anpassbare Optionen bieten kann.
  1. Mockery/Mockery: Im Vergleich zum oben genannten Spott ist dieses Tool stärker auf die Bedürfnisse von Go-Sprachentwicklern ausgerichtet. Es bietet eine flexiblere API, die die Testbarkeit von Code ermöglicht. Neben der Unterstützung von Scheinschnittstellenmethoden kann Mockery auch nicht aufdringliche externe Abhängigkeiten nachahmen.
  2. 3. Verwenden Sie testify für Mocking
Im Folgenden verwenden wir testify als Mocking-Tool und zeigen anhand eines Beispiels, wie Sie die Mocking-Technologie zum Testen von Code verwenden.

Wir gehen davon aus, dass die folgende Funktion auf einer externen HTTP-API basiert, um Daten zu erhalten:

func getOrderDetail(orderID int) (OrderDetail, error){
    resp, err := http.Get("https://api.example.com/order/"+strconv.Itoa(orderID))
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    
    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("getOrderDetail API returns error status code: %d", resp.StatusCode)
    }

    var orderDetail OrderDetail
    return orderDetail, json.NewDecoder(resp.Body).Decode(&orderDetail)
}
Nach dem Login kopieren
Um diese Funktion zu testen, müssen wir die HTTP-Anfrage verspotten. testify bietet zwei Methoden, MockHTTPServer und RoundTripper, um das Verspotten von HTTP-Anfragen zu implementieren.

Schauen wir uns zunächst an, wie man MockHTTPServer verwendet:

func TestGetOrderDetail(t *testing.T) {
    // 创建一个mock server
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 按照需要返回数据
        if r.URL.Path == "/order/123" {
            fmt.Fprintln(w, "{\"orderID\":123,\"createDate\":\"2021-01-01\"}")
        } else {
            http.Error(w, "not found", http.StatusNotFound)
        }
    }))
    defer server.Close()

    // 将http client的请求地址指向mock server
    oldClient := http.DefaultClient
    http.DefaultClient = server.Client()
    defer func() { http.DefaultClient = oldClient }()

    // 调用 getOrderDetail() 函数
    orderDetail, err := getOrderDetail(123)

    // 对 getOrderDetail() 的返回结果进行断言
    assert.Nil(t, err)
    assert.Equal(t, 123, orderDetail.OrderID) // 假设OrderDetail中包含了字段 OrderID

    // 按照需要进行其他断言
}
Nach dem Login kopieren
In diesem Beispiel verwenden wir die Methode httptest.NewServer(), um den Mock-Server zu erstellen, und dann in seiner handlerFunc() simuliert es die Rückgabe der Antwort und des Statuscodes der HTTP-Anfrage.

Als nächstes verweisen wir http.DefaultClient auf den Mock-Server, damit getOrderDetail() beim Aufruf während des Tests eine Anfrage an den Mock-Server senden kann.

Abschließend verwenden wir die Assertionsmethode von testify, um die zurückgegebenen Ergebnisse zu überprüfen und die Korrektheit der Funktion sicherzustellen.

Zusätzlich zu MockHTTPServer bietet testify auch die RoundTripper-Methode zum Verspotten von HTTP-Anfragen. Diese Methode bietet eine flexiblere und kontrollierbarere Möglichkeit, HTTP-Anfragen zu simulieren. Benutzer können die Implementierung von RoundTripper anpassen, um jederzeit zur Scheindatenquelle zu wechseln und so den Testprozess besser zu steuern. Leser können sich auf die offizielle Dokumentation von testify beziehen, um mehr über die Verwendung dieser Methode zu erfahren.

4. Verwenden Sie Spott zum Spotten

Zusätzlich zur Aussage können wir auch Spott zum Spotten verwenden. Mockery basiert auf der integrierten Mock-Bibliothek der Sprache (http://golang.org/pkg/mock/) und bietet ein Code-Generierungstool, das ein Framework für wiederverwendbaren Mock-Code generieren kann. Mockery unterstützt die Generierung von Schnittstellen- und externen Abhängigkeits-Mock-Codes. Im Folgenden stellen wir den Schnittstellenmodus Mocking vor.

Zuerst müssen wir das Spott-Generierungstool installieren:

go get github.com/vektra/mockery/v2/.../
Nach dem Login kopieren
Dann definieren wir eine Schnittstelle und fügen ihr eine Methode hinzu:

type OrderDetailFetcher interface {
    FetchOrderDetail(orderID int) (OrderDetail, error)
}
Nach dem Login kopieren
Führen Sie dann im Stammverzeichnis des Projekts den folgenden Befehl aus, um Mock-Code zu generieren:

mockery --name OrderDetailFetcher
Nach dem Login kopieren
Nach dem Login kopieren
Dadurch wird automatisch eine Datei mit dem Namen „mock_orderdetailfetcher.go“ generiert, die bereits den automatisch generierten Mock-Code enthält. Wir können diesen Mock-Code in jedem Code verwenden, um die Mock-Daten der Schnittstelle zu implementieren und die Testaufgabe abzuschließen.

Abschließend geben wir ein konkretes Beispiel, um zu demonstrieren, wie Spott zum Generieren von Mocking-Code verwendet wird:

type OrderDetail struct {
    OrderID     int
    CreateDate  string
}

type OrderDetailFetcher interface {
    FetchOrderDetail(orderID int) (OrderDetail, error)
}

func GetOrderDetail(fetcher OrderDetailFetcher, orderID int) (OrderDetail, error) {
    orderDetail, err := fetcher.FetchOrderDetail(orderID)
    if err != nil {
        return OrderDetail{}, err
    }

    return orderDetail, nil
}
Nach dem Login kopieren
In diesem Beispiel definieren wir ein Objekt mit dem Namen „OrderDetailFetcher“-Schnittstelle und implementiert eine GetOrderDetail()-Funktion, die die Verwendung der FetchOrderDetail()-Methode in der OrderDetailFetcher-Schnittstelle erfordert, um Bestelldetails abzurufen. Wir können den Befehl „spotery“ verwenden, um automatisch den Mock-Code für die Methode FetchOrderDetail() zu generieren:

mockery --name OrderDetailFetcher
Nach dem Login kopieren
Nach dem Login kopieren
Dieser Befehl generiert eine Datei mit dem Namen „mock_orderdetailfetcher.go“ im aktuellen Verzeichnis, die den automatisch generierten Code enthält Scheincode. Wir müssen nur den Mock-Code mit unserem Testcode kombinieren, um die Funktionstestaufgabe abzuschließen.

func TestGetOrderDetail(t *testing.T) {
    orderDetail := OrderDetail{OrderID: 123, CreateDate: "2021-01-01"}

    // 创建一个mock对象
    mockOrderDetailFetcher := &mocks.OrderDetailFetcher{}

    // 设定mock对象的mock调用及对应的返回结果
    mockOrderDetailFetcher.On("FetchOrderDetail", 123).Return(orderDetail, nil)

    // 调用GetOrderDetail()函数
    result, err := GetOrderDetail(mockOrderDetailFetcher, 123)

    // 校验返回结果及错误码
    assert.Nil(t, err)
    assert.Equal(t, orderDetail, result)
}
Nach dem Login kopieren
In diesem Beispiel definieren wir ein MockOrderDetailFetcher-Objekt und verwenden die On()-Methode in der Mock-Bibliothek, um eine bestimmte Aufrufregel und entsprechende Ergebnisse für ihre FetchOrderDetail()-Methode anzugeben – –OrderDetail-Objekt zurückgeben, wenn Bestell-ID ist 123. Beim Abrufen von FetchOrderDetail(123) von mockOrderDetailFetcher gibt der Testcode direkt das vorkonfigurierte orderDetail-Objekt zurück. Abschließend verwenden wir die Assertion-Methode von testify, um die Ergebnisse zu überprüfen.

Zusammenfassung

In diesem Artikel stellen wir das relevante Wissen über Mocking in Golang und gängige Mocking-Tools vor und zeigen außerdem, wie man Testify- und Mocking-Tools verwendet, um Mocking-Operationen durchzuführen und Mock-Tests der Zielfunktion abzuschließen. Durch sinnvolle und korrekte Anwendung der Mocking-Technologie können wir die Lesbarkeit, Robustheit, Zuverlässigkeit und andere Aspekte des Codes verbessern. Gleichzeitig kann Mocking uns auch dabei helfen, mögliche Probleme in verschiedenen Codes schnell zu lokalisieren und zu lösen sowie die Abdeckung und Genauigkeit des Testcodes zu verbessern.

Das obige ist der detaillierte Inhalt vonBesprechen Sie die Verwendung von Mock in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Mar 21, 2025 pm 06:37 PM

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

Wie schreibt man Unit -Tests in Go? Wie schreibt man Unit -Tests in Go? Mar 21, 2025 pm 06:34 PM

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Dieser Artikel zeigt, dass Mocks und Stubs in GO für Unit -Tests erstellen. Es betont die Verwendung von Schnittstellen, liefert Beispiele für Mock -Implementierungen und diskutiert Best Practices wie die Fokussierung von Mocks und die Verwendung von Assertion -Bibliotheken. Die Articl

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

In diesem Artikel werden die benutzerdefinierten Typ -Einschränkungen von GO für Generika untersucht. Es wird beschrieben, wie Schnittstellen die minimalen Typanforderungen für generische Funktionen definieren und die Sicherheitstypsicherheit und die Wiederverwendbarkeit von Code verbessern. Der Artikel erörtert auch Einschränkungen und Best Practices

Erläutern Sie den Zweck von Go's Reflect Package. Wann würden Sie Reflexion verwenden? Was sind die Leistungsauswirkungen? Erläutern Sie den Zweck von Go's Reflect Package. Wann würden Sie Reflexion verwenden? Was sind die Leistungsauswirkungen? Mar 25, 2025 am 11:17 AM

In dem Artikel wird das Reflect -Paket von Go, das zur Laufzeitmanipulation von Code verwendet wird, von Vorteil für die Serialisierung, generische Programmierung und vieles mehr. Es warnt vor Leistungskosten wie langsamere Ausführung und höherer Speichergebrauch, beraten die vernünftige Verwendung und am besten am besten

Wie verwenden Sie tabelgesteuerte Tests in Go? Wie verwenden Sie tabelgesteuerte Tests in Go? Mar 21, 2025 pm 06:35 PM

In dem Artikel werden mit Tabellensteuerungstests in GO eine Methode mit einer Tabelle mit Testfällen getestet, um Funktionen mit mehreren Eingaben und Ergebnissen zu testen. Es zeigt Vorteile wie eine verbesserte Lesbarkeit, verringerte Vervielfältigung, Skalierbarkeit, Konsistenz und a

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

In diesem Artikel wird die Verwendung von Tracing -Tools zur Analyse von GO -Anwendungsausführungsfluss untersucht. Es werden manuelle und automatische Instrumentierungstechniken, den Vergleich von Tools wie Jaeger, Zipkin und Opentelemetrie erörtert und die effektive Datenvisualisierung hervorheben

See all articles