2011-02-10 12 views
5

私はテスト対象のクラスの通常の実行に期待される値を返すように、私のテストクラスの@Before/setUp()メソッドのJMockit NonStrictExcpection()で嘲笑しているオブジェクトを持っています。JMockitで以前に定義された期待値を削除する

これは、このコードの非正常な動作をテストしたい単一のテストのために保存したすべてのテストメソッドで問題ありません。

私は、setUpメソッドの期待値をオーバーライドすると思われるテストメソッドで新しい期待値を作成しようとしましたが、setUpメソッドの期待値が新しい期待値を抑制していることがわかりました。

私がsetUp期待値を削除すると、テストメソッドは期待どおりに動作しますが、私の他のテストはすべて失敗します。

最小限のコードでテストごとに正しく定義されるように、テストクラスをどのようにコードする必要がありますか?(私はそれぞれのテストメソッドに期待値コードをコピー/ペーストすることができると知っていますが、はやりたくありませんが、これは避けたい場合はです)。

私のテストコードは次のようなものになります(注、これはみかん擬似コードで、コンパイルされませんが、あなたのアイデアを得る):

public class TestClass{ 

    @Before 
    public void setUp(){ 

     // Here I define the normal behaviour of mockObject 
     new NonStrictExpectations() {{ 
      mockObject.doSomething(); 
      result = "Everyting is OK!"; 
     }}; 

     // Other set up stuff... 

    } 

    // Other Tests... 

    /** 
    * This method tests that an error when calling 
    * mockObject.doSomething() is handled correctly. 
    */ 
    @Test(expected=Exception.class) 
    public void testMockObjectThrowsException(){ 

     // This Expectation is apparently ignored... 
     new NonStrictExpectations() {{ 
      mockObject.doSomething(); 
      result = "Something is wrong!"; 
     }}; 

     // Rest of test method... 

    } 
} 

答えて

5

私は通常ちょうど返すprivateメソッドを作りますExpectationsタイプ:

private Expectations expectTheUnknown() 
{ 
    return new NonStrictExpectations() 
    {{ 
     ... expectations ... 
    }}; 
} 

そしてただ正確な期待を必要とする試験方法でメソッドを呼び出します。

@Test public void testUknown() 
{ 
    expectTheUnknown(); 
    ... here goes the test ... 
} 
+0

これは手動ですべての単一のテストメソッドにexpectTheUnknown()を呼び出す必要があることを意味しませんか?また、私は 'NonStrictExpectations'を返すことは本当に必要ではないと思います。 –

+0

@IbrahimArief私は答えを書いてからしばらくしていましたが、AFAIRは、OP質問のポイントは、メソッドが呼び出されたときのより細かい制御が必要であったということでした。私はこの解決策がハックだという疑いはないと思っていますが、少なくともそれは働いています:) – Steen

+1

ああ、それは美しく、それについては間違いなく動作します。 :)もっと一般的なケースをオーバーライドする特別な期待を持っているのではなく、Jmockitの各メソッドにexpectTheUnknown()定義を広めることが他の方法ではないようだという私の心配を確認していました。 –

0

状態ベースのテストにMockUpを使用することをお勧めします。各テストメソッドで必要なモックアップを定義します。 MockUpのtearDownメソッドを呼び出して、各テストの終わりにモックを削除することができます。

It is described here

関連する問題