2013-02-26 19 views
7

私はスパイオブジェクトにMockito.verifyを使用するテストクラス(TestNGに基づいています)を持っています。Mockitoスパイをリセットする

これは動作します:

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)を追加しようとしましたが、それはまったく私を助けませんでした。

いくつかのテストで同じ方法を確認する必要がある場合、どのようにスパイオブジェクトをリセットできますか? Mockito documentationから

+0

私はhttp://programmers.stackexchange.com/questions/188299/is-this-an-で同様の質問を尋ねオーバー適切な使用方法のリセット方法。ちょうどFYI、それはスパイではなく模擬に関連していますが。 –

+0

あなたは 'reset'への呼び出しをどこに追加しようとしましたか?あなたのコードを編集してあなたの試行を表示するかもしれませんが、コメントアウトしていますか? –

+0

私はちょうどプロトタイプのサンプルを添付しました、リセット@BeforeMethod \ @BeforeClass、@Afterと同じで、確認する前に作成しようとした - それは動作しませんでした。私が理解しているように、それはスパイだけの問題であり、リセットはモックオブジェクトのためのものです。 –

答えて

12

:彼らはそれが悪いテストの兆候かもしれない知っているので、モックをリセット

(1.8.0以降)スマートMockitoのユーザーはほとんどこの機能を使用しません。通常、モックをリセットする必要はありません。テストメソッドごとに新しいモックを作成するだけです。 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(); 
     ... 
    } 
} 
+0

それぞれのテストで2回の呼び出しが必要になると言っている理由がわかりません。スパイは、各テスト方法の前に再構築されます。 –

+0

申し訳ありませんが、私はあなたの答えを間違って読んでいました:-) –

+0

実際にそれは助けになりましたが、@ InjectMocksなどのアノテーションを使用する場合は、initmocksと呼ぶ必要もあります。 –

関連する問題