Mockito方法行为



我有一个返回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的交互。

最新更新