2012-04-04 13 views
5

私はEasyMockを使用して、テストされたクラスのプライベートパラメータ(セッターなし)の1つであるモックを作成しています。反射を使ってみましたが、正しく動作しません。テストされたクラスのプライベートフィールドにEasyMockモックを注入する方法

public class TestedClassTest{ 
    @Test 
    public void test(){ 
     TestedClass instance = new TestedClass(); 
     MockedClass mocked = EasyMock.createMock(MockedClass.class); 
     Data data = new Data(); 

     //Void setter 
     DataType dataType = (myDataType.DataType) EasyMock.anyObject(); 
     mocked.setDataType(dataType); 
     EasyMock.expectLastCall(); 

     //expect 
     EasyMock.expect(mocked.getData()).andReturn(data); 
     EasyMock.replay(mocked); 

     Field field = instance.getClass().getDeclaredField("mockedClass") 
     field.setAccessible(true); 
     field.set(instance, mocked); 

     //run tested method 
     instance.someAction(); 

     EasyMock.verify(mocked); 
    } 
} 

ImがFAILED情報取得:

Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 

Imは必ずこの方法は、試験した "instance.someAction()" この問題を解決する方法

中に "MockedClass" オブジェクトに解雇されましたか?

編集 - 回答: replay.mocked()を倍増補正した後、私は(それほど単純で!)見られる一の以上のボイドの方法は、あなたの反射コードは正常に見えるEasyMock.expectLastCall()

答えて

3

を使用して宣言する必要があること。

私はEasyMockを使用して以来、長い時間がかかっていますが、replayはテストで模擬に一度呼び出されるとは限りません。あなたはそれを二度呼びます。最初のreplayコールを削除してみてください。

この場合、モックを含むフィールドを公開するのは意味がありますか?一般に、共同作業者はコンストラクターまたはセッターのいずれかを介して設定し、リフレクションの必要性を一切排除する必要があります。

EDIT - あなたのアップデートに基づいて、エラーはsetDataTypeがモックで呼び出されたが、モックはそれが呼び出されるとは思わなかったことを示します。おそらく、あなたのクラスはそれを2回呼びます。おそらく、それは順不同で呼び出されているか、あなたが期待していなかった引数で呼び出しているかもしれません(この場合、エラーは異なると思います)。

+0

訂正されていても同様の問題が発生していますか? – Marcin

+0

エラーは同じですか? – hvgotcodes

+0

編集したコードとエラー、thx! – Marcin

関連する問題