5

EasyMockを使用して、テスト済みクラスのプライベートパラメーター(セッターなし)の1つであるモックを作成しています。リフレクションを使ってみましたが、正しく動作しません。

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);
   }
}

失敗した情報を取得しています:

Unexpected method call MockedClass.setDataType(myData.MyData@104306d75):
MockedClass.getData(): expected: 1, actual: 0
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType(myData.MyData@132006d75):
MockedClass.getData(): expected: 1, actual: 0

テストされた「instance.someAction()」中に、このメソッドが「MockedClass」オブジェクトで起動されることを確認してください

この問題を解決するにはどうすればよいですか?

編集済み-回答:doubledreplay.mocked()を修正した後、もう1つのvoidメソッドを使用して宣言する必要があることがわかりました(とても簡単です!) EasyMock.expectLastCall()

4

1 に答える 1

4

リフレクションコードは問題ないようです。

EasyMockを使用してから久しぶりですがreplay、テストではモックごとに1回だけ呼び出されることになっているのではないでしょうか。あなたはそれを二度呼んでいます。replay最初の呼び出しを取り除いてみてください。

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

編集-更新に基づいて-エラーはsetDataTypeモックで呼び出されたことを示しますが、モックはそれが呼び出されることを予期していませんでした。おそらくあなたのクラスはそれを2回呼び出しているか、おそらくそれは順不同で呼び出されているか、またはあなたが予期していなかった引数でそれを呼び出しています(この場合はエラーが異なると予想しますが)。

于 2012-04-04T12:57:38.303 に答える