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



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

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

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

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

言像Java Mockito一样通过Go中的间谍调用真正的方法?

一句话:没有。

但是替代方案呢?

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

如果您的methodB()调用methodA(),则检查是否调用了methodA()本身是没有用的有用的是检查methodB()是否按预期执行。 它是否使用methodA()来实现这一点,根据定义,您的测试不应该关心一个实现细节。

一些例子:

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

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

当你断言调用了一个子方法时,你担心的是实现细节——函数的"如何"。这不是好的测试所做的。良好的测试可确保您的方法产生正确的结果。从测试的角度来看,它是否通过调用methodA()methodZ()、REST API 或使用绝地力量来做到这一点并不重要。

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

是否有可能断言一个真正的方法是通过像Java Mockito那样在golang中进行间谍调用的?

不,一点也不。

最新更新