EasyMock 2.5.2およびJUnit 4.8.2(Eclipseを介して実行)に問題があります。ここで同様の投稿をすべて読みましたが、答えは見つかりませんでした。同じメソッドをテストする2つのテストを含むクラスがあります。マッチャーを使っています。
以下は、テストコードの簡易バージョンです。
private Xthing mockXthing;
private MainThing mainThing;
@Before
public void setUp() {
mockXthing = EasyMock.createMock(Xthing.class);
mainThing = new MainThing();
mainThing.setxThing(mockXthing);
}
@After
public void cleanUp() {
EasyMock.reset(mockXthing);
}
@Test
public void testTwo() {
String abc = "abc";
EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
EasyMock.replay(mockXthing);
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
assertEquals("abc", testResult);
EasyMock.verify(mockXthing);
}
@Test
public void testOne() {
String xyz = "xyz";
EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
EasyMock.replay(mockXthing);
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
assertEquals("xyz", testResult);
EasyMock.verify(mockXthing);
}
2番目(または最後)のテストは常に次のエラーで失敗します。
Java.lang.IllegalStateException: 1 matchers expected, 2 recorded
これについての洞察は大歓迎です。
ありがとう、アン
私はまだ綿密に調べていませんが、これは疑わしいようです。
_String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
_
anyObject()
はマッチャーであり、リプレイの後にafterと呼びます。オブジェクトの生成には使用されません。 EasyMockにオブジェクトをallowするように指示するために使用されます。 EasyMockは余分なマッチャーを検出していますが、2回目のテストまで害はありません。その時点で、EasyMockが記録したがまだ使用していないマッチャーの数(2)は、2番目のdoXthing
呼び出しで予想されるパラメーターの数と一致しません(1)。
realパラメータをtestCallingXthing
(または再生モードのモック)に渡す必要があります。 null
を直接渡すか、_2
_のような実際の値を渡してみてください。
私にとってこの失敗(私の場合は2つのマッチャーが予想され、4つが記録されています)は、「同じユニットテストでeasymockとmockitoを混合しているため、誤ってmockito引数に対してeasymockのnotNull()メソッドを呼び出しています。これは失敗を引き起こしますが、テストは特定の順序で実行されます。
試してみてください:
_String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));
_
anyObject()
よりも洗練されたマッチャーがあります。これらを使用すると、コラボレーターについて型ベースのアサーションを作成できます。
eq(X value)
実際の値が期待値と等しい場合に一致します。すべてのプリミティブタイプとオブジェクトで使用できます。anyBoolean()
、anyByte()
、anyChar()
、anyDouble()
、anyFloat()
、anyInt()
、anyLong()
、anyObject()
、anyShort()
この問題を取り除くには、各テストメソッドの後にモックをリセットする必要があります。以下のコードを追加すると、この問題が解決します。
@After
public void after(){
EasyMock.reset(mockXthing)
}