12

Mockito.verifyスパイオブジェクトに使用するテストクラス(TestNGに基づく)があります。

これは機能します:

public class Program {
    @Spy
    private TestObject testObject;

    @Test
    public void test1() {
       testObject.makeSth(); 
       verify(testObject, only()).someMethodNeedToBeChecked(); 
    }
}

しかし、ここで:

public class Program {
    @Spy
    private TestObject testObject;

    @Test
    public void test1() {
       testObject.makeSth(); 
       verify(testObject, only()).someMethodNeedToBeChecked(); 
    }

    @Test
    public void test2() {
        // Some different scenario
       testObject.makeSth(); 
       verify(testObject, only()).someMethodNeedToBeChecked(); 
        ...
    }
}

someMethodNeedToBeCheckedメソッドの呼び出しが複数あるというMokito例外が発生します。もちろん追加しようとしましMockito.reset(testObject)たが、まったく役に立ちませんでした。

複数のテストで同じメソッドを検証する必要がある場合、どうすればスパイオブジェクトをリセットできますか?

4

1 に答える 1

15

Mockitoのドキュメントから:

モックのリセット(1.8.0以降)

Smart Mockitoユーザーは、テストが不十分な兆候である可能性があることを知っているため、この機能をほとんど使用しません。通常、モックをリセットする必要はありません。テストメソッドごとに新しいモックを作成するだけです。reset()の代わりに、長くて過剰に指定されたテストに対して、単純で小さく、焦点を絞ったテストメソッドを作成することを検討してください。最初の潜在的なコードの臭いは、テストメソッドの途中でreset()されます。これはおそらく、テストが多すぎることを意味します。あなたのテスト方法のささやきに従ってください:「私たちを小さくして、単一の行動に集中してください」。mockitoメーリングリストにはそれに関するいくつかのスレッドがあります。

reset()メソッドを追加した唯一の理由は、コンテナーに注入されたモックを操作できるようにするためです。

おそらく、スパイを次のように再作成する必要があります@BeforeMethod

public class Program {

    private TestObject testObject = new TestObject();
    private TestObject spyTestObject;

    @BeforeMethod
    public void buildSpy() {
        spyTestObject = spy(testObject);
    }

    @Test
    public void test1() {
       spyTestObject.makeSth(); 
       verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    }

    @Test
    public void test2() {
        // Some different scenario
       spyTestObject.makeSth(); 
       verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
        ...
    }
}
于 2013-02-26T13:47:41.823 に答える