Mockito モックオブジェクトに、次回呼び出されたときに別のものを返すように指示するにはどうすればよいでしょうか? 質問する

Mockito モックオブジェクトに、次回呼び出されたときに別のものを返すように指示するにはどうすればよいでしょうか? 質問する

そこで、クラス レベルで静的変数としてモック オブジェクトを作成しています。1 つのテストではFoo.someMethod()特定の値を返し、別のテストでは別の値を返すようにしたいのです。問題は、これを正しく動作させるにはモックを再構築する必要があるようです。モックを再構築せずに、各テストで同じオブジェクトを使用したいと思います。

class TestClass {

    private static Foo mockFoo;

    @BeforeClass
    public static void setUp() {
        mockFoo = mock(Foo.class);
    }

    @Test
    public void test1() {
        when(mockFoo.someMethod()).thenReturn(0);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value

    }

    @Test
    public void test2() {
        when(mockFoo.someMethod()).thenReturn(1);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.

    }

}

2 番目のテストでは、testObj.bar() が呼び出されたときに、値として 0 がまだ返されます... これを解決する最善の方法は何ですか?Foo各テストで の異なるモックを使用できることはわかっていますが、 から複数のリクエストを連鎖させる必要があるmockFooため、各テストで連鎖させる必要があることに注意してください。

ベストアンサー1

また、スタブ連続呼び出し(2.8.9 API の #10) この場合、複数のthenReturn呼び出しを使用するか、複数のパラメーター (varargs) を持つ1 つのthenReturn呼び出しを使用します。

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;

public class TestClass {

    private Foo mockFoo;

    @Before
    public void setup() {
        setupFoo();
    }

    @Test
    public void testFoo() {
        TestObject testObj = new TestObject(mockFoo);

        assertEquals(0, testObj.bar());
        assertEquals(1, testObj.bar());
        assertEquals(-1, testObj.bar());
        assertEquals(-1, testObj.bar());
    }

    private void setupFoo() {
        mockFoo = mock(Foo.class);

        when(mockFoo.someMethod())
            .thenReturn(0)
            .thenReturn(1)
            .thenReturn(-1); //any subsequent call will return -1

        // Or a bit shorter with varargs:
        when(mockFoo.someMethod())
            .thenReturn(0, 1, -1); //any subsequent call will return -1
    }
}

おすすめ記事