为什么我不能一起使用Mock和InjectMocks?

时间:2014-05-13 13:15:01

标签: java unit-testing testing mockito

有效建设:

@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());
    }

}

3 个答案:

答案 0 :(得分:2)

听起来你正在尝试做一些没有意义的事情。您不应该需要将任何依赖项注入到模拟中,因为根据定义,mocks在您使用when(mock.someMethod()).thenAnswer()或某些变体进行定义之前不会有任何行为。

(除非您使用的是spy(),但您明确表示您使用的是@Mock)。

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

答案 1 :(得分:1)

@InjectMocks明确指出带注释的字段不包含模拟。注释@InjectMocks @Mock不仅不受支持 - 它是矛盾的。

return stubs wherever possible,请使用:

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

但是注意the official documentation for this Answer

  

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

     

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

答案 2 :(得分:0)

模拟没有任何真正的实现。 @InjectMocks会尝试找到并调用setter来处理已经创建的任何模拟对象并将其传入.Mockito“知道”这在模拟上有点无意义,因为没有任何方法可以获得模拟对象退出,更不用说对它们有意义了。