这是该结构及其方法的示例代码
type A struct {} func (a *A) perfom(string){ ... ... .. }
然后我想从invoke()驻留在包外部的函数中调用方法,示例代码
invoke()
var s := A{} func invoke(url string){ out := s.perfom(url) ... ... }
我想invoke通过模拟performA 的方法来编写该功能的测试用例。
invoke
perform
在Java中,我们有mockito,jmock框架来存根方法调用。
有什么办法,我们可以在不引入interfaces源代码的情况下模拟struct的方法调用吗?
interfaces
要模拟方法调用,您需要模拟您的结构。
对于您提供的代码示例,我建议创建一个Performer实现您的Perform调用的接口。您的实际结构和模拟结构都将实现此接口。
Performer
Perform
我也建议您将结构作为参数传递给invoke函数,而不要使用全局变量。
这是一个例子:
type Performer interface { perform() } type A struct { } func (a *A) perform() { fmt.Println("real method") } type AMock struct { } func (a *AMock) perform () { fmt.Println("mocked method") } func caller(p Performer) { p.perform() }
在测试中,将模拟插入到您的invoke呼叫中。在您的真实代码中,将真实结构注入您的invoke调用中。
使用https://godoc.org/github.com/stretchr/testify/mock之类的库,您甚至可以真正轻松地验证使用正确的参数,正确的次数调用您的方法,并控制模拟的行为。