go - 是否可以断言通过像 Java Mockito 一样在 Go 中进行 spy 事件来调用真正的方法?

标签 go mocking gomock

我正在寻找断言我的测试中涵盖了一个语句。例如,假设从测试开始调用 methodA(),它引用了 methodB()。

我想断言在从测试中执行 methodA() 时会调用 methodB()。

在下面的代码中,我如何在 Go 测试中断言 svc.AddCheck() 在执行 svc.OnStartup() 时被调用?

func (svc *Servjice) OnStartup() error {
    if err := svc.AddCheck("cache"); err != nil {
        return err
    }
    return nil
}

最佳答案

Is it possible to assert that a real method is called via spying in Go like Java Mockito?

一句话:没有。

但是替代方案呢?

您应该测试的是函数的效果。在任何语言中都是如此,不仅仅是 Go。无论您是在进行单元测试还是一些更高级别的测试,包括端到端测试,这也是事实。

如果您的methodB() 调用methodA()本身检查methodA() 是没有用的 被调用。 有用的是检查 methodB() 是否按照您的预期进行。无论它是否使用 methodA() 来实现,根据定义,您的测试不应该关心的实现细节。

一些例子:

  • 假设您正在编写一个集成测试,methodA() 将一些内容插入到数据库中。不要断言 methodA() 已被调用——而是断言您期望的行现在已在数据库中。

  • 假设您正在为 Fibonacci 生成器编写单元测试。不要断言它是否调用了methodA(),断言它是否返回了正确的值。

当您断言一个子方法被调用时,您担心的是实现细节——函数的“方式”。这不是好的测试所做的。良好的测试可确保您的方法产生正确的结果。从测试的角度来看,无论它是通过调用 methodA()methodZ()、REST API 还是使用 Jedi powers 来实现,都应该无关紧要。

所以 TL;DR;不,你不能按照你的要求去做,但这没关系,因为你不应该按照你的要求去做。有更好的选择(甚至在 Java 中)。

关于go - 是否可以断言通过像 Java Mockito 一样在 Go 中进行 spy 事件来调用真正的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57766045/

相关文章:

amazon-web-services - Lambda API 网关 POST 参数

parallel-processing - 长时间运行的协程

python - 如何模拟类并使用 pytest-mock 控制 py.test 中的返回值?

go - 我可以模拟一个需要使用的带有指针参数的函数吗

go - zsh:找不到命令:mockgen - golang 1.18 - macOS Monterrey

function - Go中的函数和方法有什么区别?

Go lang区分 "\n"和换行符

wcf - 如何在 WF 工作流中模拟 Web 服务调用?

php - 在使用 PHPUnit 进行测试时使用实现 IteratorAggregate 接口(interface)的 Mock 类时如何防止重新声明错误?

Golang : how to mock . ..interface{} arguents 使用 gomock