6

EasyMock を使用して JUnit でテストをセットアップしようとしていますが、頭を包むことができない小さな問題に直面しています。ここの誰かが助けてくれることを願っていました。

これは、私がテストしようとしている方法の簡略化されたバージョンです。

public void myMethod() {
    //(...)
    Obj myObj = this.service.getObj(param);
    if (myObj.getExtId() != null) {
      OtherObj otherObj = new OtherObj();
      otherObj.setId(myObj.getExtId());
      this.dao.insert(otherObj);
    }
    //(...)
}

わかりましたので、EasyMock を使用してservice.getObj(myObj)呼び出しをモックしましたが、正常に動作します。

私の問題は、JUnit がdao.insert(otherObj) 呼び出しにヒットしたときに発生します。EasyMock はそれにスロー*Unexpected Method Call*します。

テストでそのdaoをモックして使用expectLastCall().once();してもかまいませんが、挿入時にパラメーターとして渡される「otherObj」のハンドルがあることを前提としています...条件付きであるため、もちろんそうではありませんテストされるメソッドのコンテキスト内で作成されます。

誰かがそれに対処しなければならなかったことがあり、どういうわけかそれを解決しましたか?

ありがとう。

4

4 に答える 4

14

EasyMock.isA(OtherObj.class)もう少し型の安全性を高めるために使用することもできます。

于 2010-05-31T01:13:28.343 に答える
9

テスト コードでオブジェクト自体への参照を取得できない場合は、メソッドEasyMock.anyObject()への予想される引数として使用できますinsert。名前が示すように、メソッドが呼び出されることを期待します..まあ、任意のオブジェクト:)

正確な引数を一致させるよりも少し厳密ではないかもしれませんが、満足している場合は、試してみてください. OtherObj予想されるメソッド呼び出しを宣言するときは、忘れずにキャストを含めてください。

于 2010-01-22T09:23:51.950 に答える
5

anyObject() マッチャーは、この呼び出しを通過したいだけの場合に最適ですが、構築されたオブジェクトが想定どおりであることを実際に検証したい場合は、Capture を使用できます。次のようになります。

Capture<OtherObj> capturedOtherObj = new Capture<OtherObj>();
mockDao.insert(capture(capturedOtherObj));
replay(mockDao);

objUnderTest.myMethod();

assertThat("captured what you expected", capturedOtherObj.getValue().getId(), 
           equalTo(expectedId));

また、PowerMockにはオブジェクトが構築されることを期待する機能があるため、必要に応じて調べることができます。

于 2011-01-29T05:25:30.637 に答える
1

を使用する場合EasyMock.createStrictMock();、メソッド呼び出しの順序も重要であり、この規則を破ると、予期しないメソッド呼び出しがスローされることに注意してください。

于 2016-09-20T12:18:00.850 に答える