不鼓励在同一领域使用@ Spy和@InjectMocks吗?

J. *_*der 24 java mocking mockito

在我正在进行的项目中,我经常在一个领域看到@Spy@InjectMocks一起使用.但我从未在任何教程或其他资源中看到过这种方式.我在谷歌搜索了这个特定的组合,但除了GitHub上的这个帖子之外没有找到任何其他内容:https: //github.com/mockito/mockito/issues/169

这让我觉得我们正在以一种奇怪的方式使用它.

注意:我认为同时使用两个注释的原因有时是因为如果您只使用@InjectMocksMockito尝试使用no-args构造函数实例化该类.但是如果没有no-args构造@Spy函数并添加,则可以使用该对象而无需空构造函数.

编辑:另一个重要用途是,如果只使用两个注释,则只能存根方法.

Jef*_*ica 33

将@ Spy和@InjectMocks结合使用是不常见的,也可能是不合适的.

@InjectMocks可以作为一种依赖注入被测系统的:如果你有一个测试定义正确类型的@Mock或@Spy,会的Mockito在@InjectMocks与这些领域的实例初始化任何字段.如果你还没有其他方式构造你的系统下测试的依赖注入,这可能是很方便(或者,如果你使用DI框架,确实字段注入),你想用嘲笑来替换那些依赖关系.它可能非常脆弱 - 无法匹配的字段将被静默忽略,null如果没有在初始化程序中设置,它将保留- 但对于被测系统仍然是一个不错的注释.

像@Mock一样,@ Spy旨在设置测试双打 ; 当你有一个想要存根或验证的协作者时,你应该使用它.请注意,@ Spy和@Mock始终用于依赖,而不是用于您测试的系统.

理想情况下,你不应该在同一个测试满足这两种角色的任何类,否则你可能会发现自己写的一个测试,测试刻意的行为,你已经存根,而不是实际的生产行为.在任何情况下,更难以确切地说明测试涵盖的内容与您存根的行为.

当然,如果您尝试使用Mockito单独测试单个方法,并且希望在测试另一个方法时将调用存根到一个方法,则可能不适用.但是,这也可能表明您的类违反了单一责任原则,并且您应该将该类分解为多个可以协同工作的独立类.然后,在您的测试中,您可以允许实例只有一个角色,而且不会同时需要两个注释.

  • @JeffBowman 公共方法A 调用同一类的公共方法B 并不罕见。为什么这是一个糟糕的设计?我已经单独测试了 methodB,并且我想通过存根 methodB 子调用来测试 methodA。有没有比在同一个类上同时使用两个注释更好的方法?也许注入自我参考? (4认同)

Bre*_*Kim 7

每个注释都有不同的用途,只要你需要使用部分模拟,它们就不会相互衔接.(已经过测试和/或信任的存根相关方法)

例如,你有一个要测试的类,它有一个不必是真实的依赖注入,所以你想要@InjectMocks.此外,您正在测试的方法调用内部的另一个方法,该方法已在某处进行过测试,或者调用外部引用,该外部引用也最有可能独立地进行测试.所以,你不想被人打扰测试同样的方法(S)一次以上,并测试代码不应该由任何时间在未来外的范围内执行更改影响.

只有@Mock和@Spy,或@Mock和@InjectMocks对没有任何意义.

  • 您将无法将 Mock 和 InjectMocks 成对使用,否则您将得到:“单个字段上不允许使用注释组合:@Mock 和 @InjectMocks” (2认同)