我希望模拟对象在每次方法调用时返回不同的值。但该方法没有参数。这里有一个例子:
public class MyClass {
public double getValue() {
return 0;
}
}
public class IteratorClass {
MyClass myClass;
public IteratorClass(MyClass myClass) {
this.myClass = myClass;
}
public void iterate() {
for (int i = 0; i < 5; i++) {
System.out.println("myClass.getValue() = " + myClass.getValue());
}
}
}
public class IteratorClassTest {
private MyClass myClass;
private IteratorClass iteratorClass;
@Before
public void setUp() throws Exception {
myClass = mock(MyClass.class);
iteratorClass = spy(new IteratorClass(myClass));
}
@Test
public void testIterate() throws Exception {
when(myClass.getValue()).thenReturn(10d);
when(myClass.getValue()).thenReturn(20d);
when(myClass.getValue()).thenReturn(30d);
when(myClass.getValue()).thenReturn(40d);
when(myClass.getValue()).thenReturn(50d);
iteratorClass.iterate();
}
}
我在这里监视一个IteratorClass并嘲笑MyClass。我希望getValue()方法在每次调用时返回不同的值。但它正在返回模拟对象上设置的最后一个值。如果getValue()方法有一些像getValue(int arg)这样的参数,那么可以根据参数返回不同的值。(例如,getValue(0)->return 10、getValue(1)->return 20等)。但当方法并没有参数时该怎么办呢?
您可以将连续的返回值指定为链式方法调用(也就是流畅的API):
@Test
public void testIterate() throws Exception {
when(myClass.getValue()).thenReturn(10d)
.thenReturn(20d)
.thenReturn(30d)
.thenReturn(40d)
.thenReturn(50d);
iteratorClass.iterate();
}
或VarAgs:
@Test
public void testIterate() throws Exception {
when(myClass.getValue()).thenReturn(10d,20d,30d,40d,50d);
iteratorClass.iterate();
}
无论哪种方式,最后一个都将被重新调整,以便对该方法进行任何进一步的调用。
根据Using Mockito的回答,使用相同的参数对同一方法进行多次调用,您应该修改代码:
...
@Test
public void testIterate() throws Exception {
when(myClass.getValue()).thenReturn(10d, 20d, 30d, 40d, 50d);
iteratorClass.iterate();
}
...