2 回答
TA贡献1848条经验 获得超2个赞
首先,您需要准备代码以使用接口和模拟。为此,我建议您在方法Service旁边声明接口CreateAndSendMail。在这种情况下,最好将服务实例传递给方法或将其用作方法所属结构的实例变量:
type Service interface {
GetName() string
GetAddress() string
}
func CreateAndSendMail(svc Service) string {
name := svc.GetName()
empAddress := svc.GetAddress()
return name + " lives in " + empAddress
}
或者
type Service interface {
GetName() string
GetAddress() string
}
type S struct {
svc Service
}
func (s *S) CreateAndSendMail() string {
name := s.svc.GetName()
empAddress := s.svc.GetAddress()
return name + " lives in " + empAddress
}
然后,您将隐式EmpInfo实现您的接口。Service这是 golang 接口的一个很酷的特性。在我们所有的准备工作之后,我们准备创建测试。为此,我们可以自己实现模拟:
import (
"testing"
)
type MockSvc struct {
}
func (s *MockSvc) GetName() string {
return "Mocked name"
}
func (s *MockSvc) GetAddress() string {
return "Mocked address"
}
func TestCreateAndSendMail(t *testing.T) {
svc := &MockSvc{}
val := CreateAndSendMail(svc)
if val != "Mocked name lives in Mocked address" {
t.Error("Value not matched")
}
}
此外,我们可以使用特殊工具gomock来自动化模拟创建过程
TA贡献2037条经验 获得超6个赞
接口是帮助测试的最常用的 Go 特性。Go 中的接口允许 Duck Typing,您可以在其中切换已实现接口的任何类型以被不同类型模拟。
从您的示例中,该服务具有以下两种方法:GetName() 和 GetAddress()。用这两种方法创建一个接口Service。
type Service Interface {
GetName() string
GetAddress() string
}
现在您的 struct EmpInfo 已经实现了 Service 接口。使用相同的 2 个函数创建一个新的 MockService 结构。
type MockService struct {}
func (ms *MockService) GetName() string {
// Mock Code
}
func (ms *MockService) GetAddress() string {
// Mock Code
}
然后,在需要的地方用 MockService 替换 EmpInfo 的实例。
PS:考虑使用指向 EmpInfo 的指针添加函数 GetName 和 GetAddress。
- 2 回答
- 0 关注
- 133 浏览
添加回答
举报