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



有效构造:

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

听起来你在做一些没有意义的事情。您不应该需要向mock注入任何依赖,因为mock在定义上没有任何行为,直到您使用when(mock.someMethod()).thenAnswer()或一些变体定义它。

(除非您正在使用spy(),但您已经明确表示您正在使用@Mock)。

也许你可以解释你的用例和为什么你试图注入依赖到模拟?

@InjectMocks明确表示注释字段将不包含模拟。注释@InjectMocks @Mock不仅是不支持的,而且是矛盾的。

在可能的情况下返回存根,使用:

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

但是要注意这个答案的官方文档:

警告:对于常规的干净代码,很少需要此特性!把它留给遗留代码。模拟一个mock来返回一个mock,返回一个mock,(…),返回一些有意义的东西,暗示违反了Demeter法则或模拟一个值对象(一种众所周知的反模式)。

有一天我在网上看到了一个很好的引用:每当一个mock返回一个mock,一个fairy就会死去

mock没有任何真正的实现。@InjectMocks将尝试查找并调用已经创建的任何模拟对象的setter,并将它们传递进去。Mockito"知道"这在模拟中是毫无意义的,因为没有任何方法可以将模拟对象取出来,更不用说对它们做任何有意义的事情了。

相关内容

  • 没有找到相关文章

最新更新