2011-08-30 9 views
1

私はeasymockでユニットテストをしていて、答えオブジェクトに結果が設定されていません。モックオブジェクトはテスト対象に渡され、処理後に同じモックオブジェクトのリファレンスが返されますが、結果セットは保持されません。状態を保存しないで模擬しました

コードが何をしているのかSubject.process

@Test 
public void test() { 
DomainInterface mock = EasyMock.create("mock", DomainInterface.class); 
Subject subject = new Subject(); 
subject.setDomainInterface(mock); 

final DomainInterface domain = subject.process(); 

assertEquals("Not the same instance", mock, domain); 

final String expected = "VALID"; 
final String answer = domain.getAnswer(); 

assertEquals("Not the expected answer", expected, answer); 
} 

鮮明な画像が検証のカップルであることを確認してからの回答に「VALID」の設定が、実行は、アサーション・エラー・メッセージ

で失敗しなければなりません
java.lang.AssertionError: Not the expected answer expected:<VALID> but was:<null> 

サブジェクトオブジェクトには、モックのリファレンスが設定されているDomainInterface型のプライベートメンバーがありますが、そのアサーションまで答えが保持されないのはなぜですか?事前

+1

残りのコードを見ずに言うのは難しいです。私はあなたがそれを短くて完全なプログラムにするために十分に抽出し、それを投稿することをお勧めします。 –

答えて

2

おかげで、私はちょうどあなたが同じモックが返されるであることを主張していることに気付きました。モックを再生モードにすることも決してreplay()に電話していることはありません。もしあれば、Subjectがメソッドを呼び出そうとするとすぐに例外がスローされます。しかしモックはそのように動作しません -

私の推測では、あなたがsetAnswerへの呼び出しを覚えているとgetAnswerが呼び出され、同じ結果を返信するモックを期待しているということです。おそらくにはが呼び出されます。が必要です。このような何か:

public void test() { 
    DomainInterface mock = EasyMock.create("mock", DomainInterface.class); 

    // Expect that the subject will call setAnswer with an argument of "VALID" 
    mock.setAnswer("VALID"); 

    EasyMock.replay(); 

    Subject subject = new Subject(); 
    subject.setDomainInterface(mock); 

    DomainInterface domain = subject.process();  
    assertEquals("Not the same instance", mock, domain); 

    // No need to assert the result of calling getAnswer - we've already asserted 
    // that setAnswer will be called. 
} 

は個人的に、私は多くのテストのための手書きの偽物のファンになってきている - モックが相互作用テスト(別名プロトコルテスト)のための素晴らしいですが、このような状況では、それがどのように見えますシンプルな偽物はまさに同様に...あるいは多分単純なビット(偽物)を偽造するが、相互作用テストを必要とするビットのためのモックを可能にする混合物。

+0

ありがとうございました、あなたが指摘したように、私はそのモックのリプレイ()を呼び出すことはなかったし、模擬方法が誤解されることもありませんでした。今それは働いている。 – iapazmino

関連する問題