我希望模拟对象在每次方法调用时返回不同的值。但该方法没有参数。这是一个例子:
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) - &gt;返回10,getValue(1) - &gt;返回20等)。 但是当方法没有参数时怎么做?
答案 0 :(得分:2)
您可以将连续返回值指定为链式方法调用(也称为流畅API):
@Test
public void testIterate() throws Exception {
when(myClass.getValue()).thenReturn(10d,20d,30d,40d,50d);
iteratorClass.iterate();
}
或作为VarAgs:
export var GOOGLE_API_URL = 'https://www.googleapis.com/admin/directory/v1';
// default err string message
export var errStringMsg = 'Something went wrong';
无论哪种方式,最后一个将被重新调用以进一步调用该方法。
答案 1 :(得分:1)
根据Using Mockito with multiple calls to the same method with the same arguments的回答,你应该修改你的代码:
...
@Test
public void testIterate() throws Exception {
when(myClass.getValue()).thenReturn(10d, 20d, 30d, 40d, 50d);
iteratorClass.iterate();
}
...