我有一个返回A类型的对象的工厂接口B.类型A也是一个接口。
我很难弄清楚如何在模拟中定义 A.doSomething() 的方法行为,因为每次工厂返回 A 的新实例时,它都需要知道如何做某事()。
这就是我到目前为止嘲笑工厂的方法,但是 A 不知道如何做某事()。
when(B.getObject()).thenReturn(Mockito.mock(A.class));
有没有某种方法可以为将返回的所有 A 实例定义 A.doSomething()?
任何帮助将不胜感激。
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());
但由于"嵌套"嘲笑,它不起作用。更多细节在这里。
如果其他人遇到类似的情况,这就是在评论中建议的 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;
}
});
作为一个模拟工厂,你的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
的交互。