Mockito方法行为

时间:2016-02-05 00:30:00

标签: java junit mockito

我有一个工厂接口B,它返回A类对象。类型A也是一个接口。

我无法弄清楚如何在我的模拟中为A.doSomething()定义方法行为,因为每次工厂返回A的新实例时,它都需要知道如何做SomeSome()。

这是我迄今为止嘲笑工厂的原因,但A不知道如何做某事()。

when(B.getObject()).thenReturn(Mockito.mock(A.class));

我是否可以通过某种方式为将要返回的A的所有实例定义A.doSomething()?

非常感谢任何帮助。

3 个答案:

答案 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的交互。