Heim  >  Artikel  >  Backend-Entwicklung  >  Wie integriere ich Bibliotheken von Drittanbietern in Golang-Unit-Tests?

Wie integriere ich Bibliotheken von Drittanbietern in Golang-Unit-Tests?

PHPz
PHPzOriginal
2024-06-04 12:24:58773Durchsuche

Die Integration von Bibliotheken von Drittanbietern in Golang-Komponententests kann durch Abhängigkeitsinjektion oder Verwendung von Stubs erreicht werden: Abhängigkeitsinjektion: Verwenden Sie Mocks oder Stubs anstelle tatsächlicher Bibliotheksimplementierungen. Beispiel: Verwenden Sie MockDependency, um eine Bibliothek eines Drittanbieters zu verspotten und sie in die zu testende Funktion einzufügen. Stub: Bietet Zugriff auf die echte Bibliotheksimplementierung. Beispiel: Verwenden Sie stubFunc, um eine tatsächliche Funktion in einer Bibliothek eines Drittanbieters zu unterbrechen und ihr Verhalten zu überschreiben.

如何在 Golang 单元测试中集成第三方库?

So integrieren Sie Bibliotheken von Drittanbietern in Golang-Komponententests

Die Integration von Bibliotheken von Drittanbietern in Golang-Komponententests erfordert einige Fähigkeiten. Dieser Artikel führt Sie durch die Bewältigung dieser Aufgabe und bietet ein praktisches Beispiel dafür.

1. Abhängigkeitsinjektion verwenden

Abhängigkeitsinjektion ist eine effektive Möglichkeit, Bibliotheken von Drittanbietern in Tests zu isolieren. Es ermöglicht Ihnen, Mocks oder Stubs in Ihren Tests bereitzustellen, anstatt die eigentliche Bibliotheksimplementierung zu verwenden.

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

// MockDependency 模拟第三方库
type MockDependency struct {
    result int
}

// Method 模拟第三方库的方法
func (m *MockDependency) Method() int {
    return m.result
}

func TestFunctionUnderTest(t *testing.T) {
    // 使用模拟的依赖项
    dependency := &MockDependency{result: 42}

    // 调用待测函数
    result := FunctionUnderTest(dependency)

    // 断言结果
    assert.Equal(t, 42, result)
}

2. Stubs verwenden

Stubs sind eine weitere Möglichkeit, Bibliotheken von Drittanbietern zu isolieren. Im Gegensatz zu Mocks bieten Stubs Zugriff auf die echte Bibliotheksimplementierung, ermöglichen Ihnen jedoch die Steuerung ihrer Aufrufe durch Abfangen oder Ändern ihres Verhaltens.

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/google/go-cmp/cmp"
)

func TestFunctionUnderTest(t *testing.T) {
    // 使用存根函数
    stubFunc := func() (string, error) {
        return "stubbed result", nil
    }
    originalFunc := library.Func

    // 覆盖实际函数
    library.Func = stubFunc

    // 调用待测函数
    result, err := FunctionUnderTest()

    // 还原实际函数
    library.Func = originalFunc

    // 断言结果
    assert.NoError(t, err)
    diff := cmp.Diff("stubbed result", result)
    assert.Empty(t, diff)
}

Praktischer Fall

Angenommen, wir haben eine Funktion NewService,它从第三方库 github.com/example/service, um eine Dienstinstanz zu erhalten. Wir können die Abhängigkeitsinjektion verwenden, um diese Funktion zu testen:

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/example/service"
)

// MockService 模拟 service 库
type MockService struct {
    result *service.Service
}

// NewMockService 返回一个模拟的服务实例
func NewMockService(result *service.Service) *MockService {
    return &MockService{result: result}
}

// Service 返回模拟的服务实例
func (m *MockService) Service() *service.Service {
    return m.result
}

func TestNewService(t *testing.T) {
    // 使用模拟的服务
    mockService := NewMockService(&service.Service{})

    // 调用待测函数
    newService, err := NewService(mockService)

    // 断言结果
    assert.NoError(t, err)
    assert.Equal(t, &service.Service{}, newService)
}

Das obige ist der detaillierte Inhalt vonWie integriere ich Bibliotheken von Drittanbietern in Golang-Unit-Tests?. 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