如何在go中模拟测试用例中结构的方法调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在go中模拟测试用例中结构的方法调用相关的知识,希望对你有一定的参考价值。
以下是结构及其方法的示例代码
type A struct {}
func (a *A) perfom(string){
...
...
..
}
然后我想从驻留在包外的函数invoke()
调用该方法,示例代码
var s := A{}
func invoke(url string){
out := s.perfom(url)
...
...
}
我想通过模拟A的invoke
方法为函数perform
编写测试用例。
在java中,我们有用于存根方法调用的mockito,jmock框架。
有没有办法,我们可以在不在源代码中引入interfaces
的情况下模拟结构的方法调用?
答案
要模拟方法调用,您需要模拟您的结构。
使用您提供的代码示例,我建议制作一个实现Performer
调用的Perform
接口。您的真实结构和模拟结构都将实现此接口。
我还建议将您的结构作为参数传递给调用函数,而不是使用全局变量。
这是一个例子:
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这样的库,您甚至可以非常轻松地验证您的方法是使用正确的参数调用的,称为适当的次数,并控制模拟的行为。
以上是关于如何在go中模拟测试用例中结构的方法调用的主要内容,如果未能解决你的问题,请参考以下文章
如何在量角器测试用例中模拟“Control + Space”?
在 Laravel 测试用例中模拟一个 http 请求并解析路由参数