在我现在正在进行的项目中,
我经常看到@Spy
and @InjectMocks
在田野上一起使用。
我从未在任何教程或其他资源中看到过这种方式。
我用谷歌搜索了这个特定的组合,但没有
在 GitHub 上找到除此线程之外的其他任何内容:https://github.com/mockito/mockito/issues/169
这让我觉得我们正在以一种奇怪的方式使用它。
注意:我认为同时使用这两个注释的原因
有时是有道理的,因为如果你只使用@InjectMocks
Mockito 尝试使用无参数构造函数实例化该类。
如果您没有无参数构造函数并添加@Spy
您可以使用该对象而无需空构造函数。
编辑:另一个重要的用途是你只能存根方法
如果您只使用这两个注释。
@Spy 和 @InjectMocks 不能很好地一起使用(请参阅Google 代码问题 #489 and GitHub 问题 #169),并且对于它们的作用来说,它们根本不应该一起使用,这还不清楚或不常见。在编写良好的 Mockito 用法中,您通常甚至不应该want将它们应用到同一个对象。
-
@InjectMocks作为被测系统的一种替代依赖注入:如果您有一个定义了正确类型的 @Mock 或 @Spy 的测试,Mockito 将使用这些测试的内容初始化 @InjectMocks 实例中的任何字段字段。如果您没有以其他方式构建被测系统以进行依赖项注入(或者如果您使用进行字段注入的 DI 框架)并且您希望用模拟替换这些依赖项,那么这可能会很方便。它可能非常脆弱——不匹配的字段将被默默地忽略并保留null
如果未在初始化程序中设置,但仍然是一个不错的注释对于您的被测系统.
-
@Spy, like @Mock,旨在建立测试双打;当您想要存根或验证合作者时,应该使用它。尽管有些情况下您could监视您的被测系统,@Spy 和 @Mock 的意思是用于依赖项,而不是用于您正在测试的功能.
理想情况下,您不应该有任何类在同一个测试中满足这两个角色,否则您可能会发现自己编写的测试辛苦地测试了您已存根的行为,而不是实际的生产行为。无论如何,要准确区分测试涵盖的内容与您所阻止的行为将会更加困难。
当然,如果您尝试使用 Mockito 单独测试单个方法,并且希望在测试另一种方法时对一种方法进行存根调用,则这可能不适用。这可以通过创建被测系统的间谍并模拟其某些方法以避免调用协作者来完成。但是,这也可能表明您的类违反了单一职责原则,并且您应该将类分解为多个可以一起工作的独立类。然后,在您的测试中,您可以允许实例仅具有一个角色,并且永远不需要同时使用两个注释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)