如何在每次调用时更改mocked方法的返回值而不带参数?

时间:2017-01-09 09:33:39

标签: java unit-testing mockito

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

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等)。 但是当方法没有参数时怎么做?

2 个答案:

答案 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();
}
...