Java 如何在每次调用时都不带参数的情况下更改模拟方法的返回值?

Java 如何在每次调用时都不带参数的情况下更改模拟方法的返回值?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我希望模拟对象在其每个方法调用上返回不同的值。但该方法没有参数。以下是一个例子: public class MyClass { public double getValue() { return 0; } } public class IteratorClass { MyClass myClass; public IteratorClass(MyClass myClass) { this.myClass = myCla

我希望模拟对象在其每个方法调用上返回不同的值。但该方法没有参数。以下是一个例子:

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();
    }
}
公共类MyClass{
公共双getValue(){
返回0;
}
}
公共类迭代器类{
MyClass MyClass;
公共迭代器类(MyClass MyClass){
this.myClass=myClass;
}
公共void iterate(){
对于(int i=0;i<5;i++){
System.out.println(“myClass.getValue()=”+myClass.getValue());
}
}
}
公共类迭代器类测试{
私人MyClass MyClass;
私有迭代器类迭代器类;
@以前
public void setUp()引发异常{
myClass=mock(myClass.class);
iteratorClass=spy(新的iteratorClass(myClass));
}
@试验
public void testIterate()引发异常{
当(myClass.getValue())。然后返回(10d);
当(myClass.getValue())。然后返回(20d);
当(myClass.getValue())。然后返回(30d);
当(myClass.getValue())。然后返回(40d);
当(myClass.getValue())。然后返回(50d);
iteratorClass.iterate();
}
}
我在这里监视一个迭代器类并模仿我的类。我希望getValue()方法在每次调用时返回不同的值。但它正在返回模拟对象上设置的最后一个值。如果getValue()方法有一些参数,如getValue(int arg),则可以根据参数返回不同的值。(例如getValue(0)->返回10,getValue(1)->返回20等)。
但是当方法没有参数时该如何处理呢?

您可以将连续返回值指定为链式方法调用(也称为fluent API):

或者作为瓦拉格:

@Test
public void testIterate() throws Exception {

    when(myClass.getValue()).thenReturn(10d,20d,30d,40d,50d);

    iteratorClass.iterate();
}
无论哪种方法,最后一个方法都将被重新调谐,以便进一步调用该方法。

根据您的回答,您应该修改代码:

...
@Test
public void testIterate() throws Exception {
    when(myClass.getValue()).thenReturn(10d, 20d, 30d, 40d, 50d);
    iteratorClass.iterate();
}
...

重复问题。这里也讨论了同样的问题:@DmitryGovets ThanksSecond variant with arguments似乎更好。@在大多数情况下,但是如果第三个调用会导致异常,而下面的调用不会导致异常呢?那么我认为这个变量更合适
...
@Test
public void testIterate() throws Exception {
    when(myClass.getValue()).thenReturn(10d, 20d, 30d, 40d, 50d);
    iteratorClass.iterate();
}
...