通过Mock玩转Golang单元测试!
package example
import (
"errors"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
// 假设我们有一个Dependency接口和一个使用该接口的Service结构体
type Dependency interface {
DoSomething(arg string) (string, error)
}
type Service struct {
dependency Dependency
}
func (s *Service) DoServiceThing(arg string) (string, error) {
result, err := s.dependency.DoSomething(arg)
if err != nil {
return "", err
}
return result, nil
}
// 下面是Dependency接口的Mock实现
type MockDependency struct {
mock.Mock
}
func (m *MockDependency) DoSomething(arg string) (string, error) {
args := m.Called(arg)
return args.String(0), args.Error(1)
}
// 下面是测试Service的函数
func TestService(t *testing.T) {
// 创建一个Mock实例
mockDependency := new(MockDependency)
service := Service{dependency: mockDependency}
// 配置Mock实例的预期行为
expectedResult := "expected result"
mockDependency.On("DoSomething", mock.Anything).Return(expectedResult, nil)
// 执行测试函数
result, err := service.DoServiceThing("input")
assert.NoError(t, err)
assert.Equal(t, expectedResult, result)
// 断言预期的调用是否发生
mockDependency.AssertExpectations(t)
}
// 下面是测试Service时出错的情况
func TestServiceError(t *testing.T) {
// 创建一个Mock实例
mockDependency := new(MockDependency)
service := Service{dependency: mockDependency}
// 配置Mock实例的预期行为
expectedError := errors.New("something went wrong")
mockDependency.On("DoSomething", mock.Anything).Return("", expectedError)
// 执行测试函数并断言错误返回
_, err := service.DoServiceThing("input")
assert.EqualError(t, err, expectedError.Error())
// 断言预期的调用是否发生
mockDependency.AssertExpectations(t)
}
这个代码实例展示了如何使用testify/mock
包来创建一个模拟的Dependency
接口,并为Service
结构体提供服务时进行单元测试。它演示了如何设置预期的行为,并验证方法是否按预期调用。此外,它还展示了如何测试预期的错误情况。这是一个很好的教学示例,对于学习如何在Go中进行模拟和单元测试的开发者来说,具有很好的参考价值。
评论已关闭