你可以在没有定义@Mock字段的情况下@InjectMock深层存根吗?

时间:2017-02-23 17:25:45

标签: java unit-testing junit mockito

您是否可以mocks注入@InjectMock深层存根,还是需要使用深存根定义每个模拟?定义一个未使用的字段只是为了用深层存根来注释它是不方便的。

示例,有没有办法在不定义注入的情况下执行此操作,因为它从未在任何地方使用过?

@InjectMocks
private Object testMe;

@Mock (answer = Answers.RETURNS_DEEP_STUBS)
private Object injected;

1 个答案:

答案 0 :(得分:0)

不,你不能。你还堆积了一系列有趣的警告标签:

  • 来自RETURNS_DEEP_STUBS

      

    警告:常规清洁代码很少需要此功能!留下遗留代码。嘲笑一个模拟器来返回一个模拟器,返回一个模拟器,(...),返回违反Demeter法则的一些有意义的提示或者模拟一个值对象(一个众所周知的反模式)。

         

    好的引用我在网上看到了一天:每次模拟返回模拟时,一个仙女死去

  • 来自@InjectMocks

      

    Mockito将尝试仅通过构造函数注入,setter注入或属性注入按顺序注入模拟,如下所述。如果以下任何策略失败,则Mockito 将不会报告失败;即你必须自己提供依赖。

         

    构造函数注入; 选择最大的构造函数,然后使用仅在测试中声明的模拟解析参数。如果使用构造函数成功创建了对象,则 Mockito将不会尝试其他策略。如果有一个参数化的构造函数,Mockito决定不对[原文]的对象进行破坏。

通过允许带有自动深度存根的InjectMocks,您可能会发现很难推断出您实际使用的注入样式和字段数量,以及测试的哪些部分是真实的而不是模拟的。除了通过被测系统直接获取任何值之外,这还可以防止存根或验证任何值,这可能会产生副作用或以其他方式打破实际代码和测试代码之间的界限。

简而言之,答案是“不”;更长的答案是你应该考虑重构以包括适当的依赖注入访问,并避免任何当前的Law of Demeter违规。