我有一个工厂接口B,它返回A类对象。类型A也是一个接口。
我无法弄清楚如何在我的模拟中为A.doSomething()定义方法行为,因为每次工厂返回A的新实例时,它都需要知道如何做SomeSome()。
这是我迄今为止嘲笑工厂的原因,但A不知道如何做某事()。
when(B.getObject()).thenReturn(Mockito.mock(A.class));
我是否可以通过某种方式为将要返回的A的所有实例定义A.doSomething()?
非常感谢任何帮助。
答案 0 :(得分:1)
A a = createA();
when(B.getObject()).thenReturn(a);
private static A createA() {
A result = Mockito.mock(A.class);
when(A.doSomething()).thenReturn(something);
return result;
}
您可能会尝试尝试以下内容:
when(B.getObject()).thenReturn(createA());
但由于嵌套'它不起作用。嘲讽。更多详情here。
答案 1 :(得分:0)
如果其他人遇到类似的情况,那么在按照评论中的建议玩thenAnswer()之后,最终会为我工作。
private static A createA() {
A a = Mockito.mock(A.class);
when(a.doSomething()).thenReturn(...);
return a;
}
when(B.getObject()).thenAnswer(new Answer<A>(){
@Override
public A answer(InvocationOnMock invocation) throws Throwable {
A a = createA();
return a;
}
});
答案 2 :(得分:0)
作为一个模拟工厂,你的SUT通常不应该关心它是否每次都是“新实例”。
因此,您需要做的只是:
B mockFactory = mock(B.class);
A mockA = mock(A.class);
when(mockFactory.getObject()).thenReturn(mockA);
when(mockA.doSomething()).thenReturn(123);
// Call your SUT, and then whenever the factory's getObject() is called,
// it will return the same mockA, and when mockA.doSomething() is called,
// it will always return 123.
当然,您可以使用doAnswer()
并每次都返回一个新的模拟A
。但是,您很难验证与A
的交互。