我正在寻找断言我的测试中涵盖了一个语句。例如,假设从测试中调用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中进行间谍调用的?
不,一点也不。