如何在 go 单元测试中使用 mock 和 stub 模拟依赖关系:mock:创建模拟依赖关系的完整实现,并预定义对特定输入的响应行为。stub:创建依赖关系的精简版本,仅定义特定输入的预定义输出。实战案例:使用 mock:预定义依赖关系(myinterface)在特定输入(a)下的行为,并对其调用进行验证。使用 stub:直接定义依赖关系(myinterface)在特定输入(a)下的输出,无需创建完整实现。
如何在 Go 单元测试中使用 Mock 和 Stub 模拟依赖关系
在单元测试中,模拟依赖关系对于隔离测试代码和实际实现非常重要。Go 语言提供了几种方法来模拟依赖关系,包括 Mock 和 Stub。
Mock
立即学习“go语言免费学习笔记(深入)”;
Mock 是一种模拟依赖关系的完整实现。它允许你预定义依赖关系响应特定输入的行为。你可以使用以下步骤创建 Mock:
type MyInterface interface {
MethodA(a int) int
}
type MyMock struct {
MethodACalledCount int
MethodAResult int
}
func (m *MyMock) MethodA(a int) int {
m.MethodACalledCount++
return m.MethodAResult
}
Stub
Stub 是 Mock 的一个更简单的版本。它只定义了特定输入的预定义输出,而不提供完整的实现。你可以使用以下步骤创建 Stub:
type MyInterface interface {
MethodA(a int) int
}
type MyStub struct {
A int
Result int
}
func (s MyStub) MethodA(a int) int {
return s.Result
}
实战案例
假设你有一个函数 MyFunction,它调用依赖关系 MyInterface.MethodA:
func MyFunction(a int, myInterface MyInterface) int {
return a + myInterface.MethodA(a)
}
为了测试 MyFunction,你可以使用 Mock 或 Stub 来模拟 MyInterface:
使用 Mock:
func TestMyFunction_Mock(t *testing.T) {
mock := &MyMock{}
mock.MethodAResult = 10
result := MyFunction(5, mock)
if result != 15 {
t.Errorf("Expected 15, got %d", result)
}
}
使用 Stub:
func TestMyFunction_Stub(t *testing.T) {
stub := MyStub{A: 5, Result: 10}
result := MyFunction(5, stub)
if result != 15 {
t.Errorf("Expected 15, got %d", result)
}
}