繁体   English   中英

为什么我不能同时使用Mock和InjectMocks?

[英]Why Cannot I use Mock and InjectMocks together?

有效构造:

@InjectMocks
SomeClass sc = mock(SomeClass.class);

无效的构造:

@InjectMocks
@Mock
SomeClass sc;

我想将模拟注入另一个模拟。 我只想使用注释样式。

为什么在Mockito中禁止进行第二次建造?

更新

例:

    public class ArrTest {
    private SomeClass someClass;

    public List<String> foo(){
        anotherMethod(); // I suppose that this method works. I want to test it separately.
        //logic which I need to test
        return someClass.doSmth();// I suppose that this method works. I want to test it separately.
    }
    public void anotherMethod(){
        ///...
    }
}

public class SomeClass {
    public List<String> doSmth(){
        return null;
    }
}

测试

public class ArrTestTest {
    @InjectMocks
    ArrTest arrTest = Mockito.mock(ArrTest.class);
    @Mock
    SomeClass someClass;
    @Test
    public void fooTest(){        
         Mockito.when(someClass.doSmth()).thenReturn(new ArrayList<String>());
         Mockito.doNothing().when(arrTest).anotherMethod();
         System.out.println(arrTest.foo());
    }

}

听起来您正在尝试做一些没有实际意义的事情。 不需要将任何依赖项注入到您的模拟中,因为按定义进行模拟不会有任何行为,除非您使用when(mock.someMethod()).thenAnswer()或某些变体对其进行定义。

(除非您使用的是spy() ,但您特别声明您使用的是@Mock )。

也许您可以解释您的用例,以及为什么要尝试将依赖项注入到模拟中?

@InjectMocks专门指示带注释的字段将不包含模拟。 注释@InjectMocks @Mock不仅不受支持,而且是矛盾的。

尽可能返回存根 ,请使用以下命令:

@Mock(answer=Answers.RETURNS_DEEP_STUBS)
YourClass mockYourClassWithDeepStubs;

但是请注意此答案的官方文档

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

我在网上看到过的好报价: 每次模拟返回模拟时,仙女都会死去

模拟没有任何实际的实现。 @InjectMocks会尝试查找并调用已创建的模拟对象并将其传递给setter。Mockito“知道”这对模拟来说毫无意义,因为没有任何方法可以将模拟对象撤回。 ,更不用说对他们有意义的事情了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM