Reflection 如何使用反射实现或模拟Go接口?
我想用反射实现Go接口,以生成mock和stub。但是如果我看了这个包,我就不知道怎么做了(也许这是不可能的) 示例:测试func是否在以下位置调用Reflection 如何使用反射实现或模拟Go接口?,reflection,mocking,go,stub,stubbing,Reflection,Mocking,Go,Stub,Stubbing,我想用反射实现Go接口,以生成mock和stub。但是如果我看了这个包,我就不知道怎么做了(也许这是不可能的) 示例:测试func是否在以下位置调用WriteHeader(404): 使用RhinoMocks(C#)我会这样写: var responseWriterMock = MockRepository.GenerateMock<ResponseWriter>(); funcToTest(responseWriterMock); responseWriterMock.Asse
WriteHeader(404)
:
使用RhinoMocks(C#)我会这样写:
var responseWriterMock = MockRepository.GenerateMock<ResponseWriter>();
funcToTest(responseWriterMock);
responseWriterMock.AssertWasCalled(rw => rw.WriteHeader(404));
var responseWriterMock=MockRepository.GenerateMock();
funcToTest(responseWriterMock);
调用responseWriterMock.Assertwas(rw=>rw.WriteHeader(404));
如何使用反射实现Go接口
附录
据我所知以及的答案,不可能在运行时创建新类型
您可能想尝试一下,它应该支持在其范围内定义新类型。不幸的是,由于该语言的静态特性,反射包有点有限,无法在运行时创建动态对象。这可能永远不可能 我可以提出一些解决方案——都涉及在设计时创建任何存根/模拟
interface{}
类型。这允许框架提供更高级的参数匹配器,但也意味着您需要确保以正确的顺序传递正确数量的参数
根据我的经验,使用此工具编写的测试往往会有更大的侧面,有时阅读起来更复杂。从好的方面来说,它们通常会更彻底地测试事物,并且更具表现力我上面提供的一些选项要求您运行命令行工具来生成模拟的源代码。随着需要模拟的接口数量的快速增长,有一个很酷的技巧可以用来跟踪所有内容 您可以利用go中的
go:generate
功能轻松生成所有存根/赝品,而无需调用任何命令参数或手动运行每个界面的工具
您只需在包含界面的文件中添加适当的go:generate
注释
mock
//go:generate mockgen -source person.go
type Person interface {
Name() string
Age() int
}
造假者
//go:generate counterfeiter ./ Person
type Person interface {
Name() string
Age() int
}
然后,您可以在项目的根目录中运行
go generate./…
命令,所有存根/伪存根都将为您重新生成。如果您正在与多个合作者合作的项目中工作,这可能是一个救命稻草。请添加一些可能是无效的Go代码,以显示您希望实现的目标。一、 首先,对你的要求有一点了解。是的,我想你不需要反思;-)我添加了一个示例,正如您所见,我只需要实现模拟和创建结构的函数。go:generate
技巧非常有用。谢谢
//go:generate counterfeiter ./ Person
type Person interface {
Name() string
Age() int
}