如何在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”?

在单元测试用例中模拟 Angular $window

在 Laravel 测试用例中模拟一个 http 请求并解析路由参数

如何模拟酶测试用例中的拖放?

解释测试用例中使用的“setUp”和“tearDown”Python方法

Pytest学习-如何在用例代码中调用fixtrue时传入参数