1. ホーム

[解決済み】Mockitoのモックオブジェクトが次に呼び出されたときに異なるものを返すように指示するには?

2022-04-01 21:49:28

質問

そこで、モックオブジェクトをクラスレベルの静的変数として以下のように作成しています。 あるテストでは 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 つまり、各テストでチェーニングを行う必要があるのです。

解決方法は?

まず、モックを静的なものにしないことです。プライベートフィールドにしましょう。setUpクラスを @Before ではなく @BeforeClass . 何度も走るかもしれないけど、安いんだよ。

次に、今ある方法は、モックがテストによって異なるものを返すようにするための正しい方法です。