我的模拟方法在每次调用时都返回相同的实例,如何获取它以返回新实例?

时间:2018-09-21 16:51:13

标签: java testing mocking mockito

private mockedObject cpMock;

@Test
public void test() {

    Manager managerTest = new Manager(cpMock, size);

    Instance instance = new Instance(size);
    when(cpMock.requestInstance()).thenReturn(instance);

}

2 个答案:

答案 0 :(得分:3)

thenReturn有一个重载,它有一个var-arg参数:

when(cpMock.requestInstance())
   .thenReturn(instance, instance1, instance2, instance3);

根据其javadocs,它将按此顺序返回这些对象。从第4次调用开始,将返回instance3(最后一个值):

  

设置调用该方法时要返回的连续返回值。例如:   when(mock.someMethod()).thenReturn(1, 2, 3);   
序列中的最后一个返回值(例如3)确定了进一步连续调用的行为。

答案 1 :(得分:0)

当您要做的只是返回一个预先计算的值时,

thenReturn很好。如果您想在每次调用方法时模拟一个实例以做某事,那么正确的解决方案是Answer(与thenAnswer或{{1一起传递}}),它是一种与Java 8配合使用的单方法接口。您可以使用其InvocationOnMock参数获取有关调用(包括其参数)的详细信息,并且doAnswer的返回值将充当方法的返回值。

当您需要调用具有副作用(例如修改其参数或调用回调函数)时,这也是一个很好的解决方案。

Answer.answer

没有lambdas,调用会更加冗长一些,但还算不错:

when(cpMock.requestInstance()).thenAnswer(invocation => new Instance(size));