是否可以像 Java Mockito 一样断言 Go 中通过监视来调用真正的方法?

问题描述 投票:0回答:3

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

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

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

func (svc *Servjice) OnStartup() error {
    if err := svc.AddCheck("cache"); err != nil {
        return err
    }
    return nil
}
go mocking gomock
3个回答
3
投票

是否可以像 Java Mockito 一样断言 Go 中通过监视来调用真正的方法?

一句话:不。

但是替代方案呢?

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

如果您的

methodB()
调用
methodA()
,则检查 本身 是否被调用是没有用的。
有用的是检查methodA()是否符合您的预期。  无论它是否使用 
methodB()
来实现这一点,根据定义,您的测试都不应该关心实现细节。

一些例子:

    假设您正在编写集成测试,并且
  • methodA()

    向数据库中插入一些内容。不要断言

    methodA()
    被调用,而是断言您期望的行现在位于数据库中。
    
    

  • 假设您正在为斐波那契生成器编写单元测试。不要断言它是否调用
  • methodA()

    ,断言它是否返回正确的值。

    
    

  • 当您断言调用子方法时,您会担心实现细节——函数的“方式”。这不是好的测试的作用。良好的测试可确保您的方法产生正确的结果。从测试的角度来看,无论是通过调用
methodA()

methodA()
、REST API 还是使用 Jedi 力量来实现这一点,都无关紧要。

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


2
投票
是否可以像 Java Mockito 一样断言 golang 中通过间谍方式调用真正的方法?

不,一点也不。


0
投票
https://pkg.go.dev/github.com/stretchr/testify/mock#Mock.AssertCalled

类似java mockito的用法还有很多:

methodZ()

	
© www.soinside.com 2019 - 2024. All rights reserved.