Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你能在不定义@Mock字段的情况下@InjectMock深存根吗?_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 你能在不定义@Mock字段的情况下@InjectMock深存根吗?

Java 你能在不定义@Mock字段的情况下@InjectMock深存根吗?,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,您可以将mock注入到@InjectMock中,使其成为深存根,还是需要使用深存根定义每个mock?仅为了用深存根对未使用字段进行注释而定义该字段是不方便的 例如,有没有一种方法可以做到这一点而不定义injected,因为它从未在任何地方使用过 @InjectMocks private Object testMe; @Mock (answer = Answers.RETURNS_DEEP_STUBS) private Object injected; 不,你不能。您还可以收集各种有趣的警告标

您可以将
mock
注入到
@InjectMock
中,使其成为深存根,还是需要使用深存根定义每个mock?仅为了用深存根对未使用字段进行注释而定义该字段是不方便的

例如,有没有一种方法可以做到这一点而不定义injected,因为它从未在任何地方使用过

@InjectMocks
private Object testMe;

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

不,你不能。您还可以收集各种有趣的警告标签:

  • 发件人:

    警告:常规干净代码很少需要此功能!留给遗留代码。Mocking a mock返回mock,返回mock,(…),返回违反德米特定律或模拟值对象(众所周知的反模式)的有意义的提示

    有一天我在网上看到了一句很好的话:每次模拟返回一个模拟,一个仙女就死了

  • 发件人:

    Mockito将尝试仅通过构造函数注入、setter注入或属性注入按顺序注入mock,如下所述。如果以下任何策略失败,Mockito将不会报告失败;i、 e.您必须自己提供依赖项

    构造函数注入选择最大的构造函数,然后仅使用测试中声明的mock解析参数。如果使用构造函数成功创建了对象,那么Mockito将不会尝试其他策略。Mockito已决定,如果对象具有参数化构造函数,则不会[sic]损坏该对象

通过允许使用自动深存根的InjectMock,您可能会发现很难解释您实际使用的注入样式和字段填充,以及测试的哪些部分是真实的而不是模拟的。这还将防止您通过直接通过被测系统获取任何值以外的方式来存根或验证任何值,这可能会产生副作用或打破实际代码和测试代码之间的界限

简言之,答案是“不”;较长的答案是,您应该考虑重构,包括适当的依赖注入注入,避免任何当前违反。