web-dev-qa-db-ja.com

EasyMock:Java.lang.IllegalStateException:1つのマッチャーが予期され、2つが記録されました

EasyMock 2.5.2およびJUnit 4.8.2(Eclipseを介して実行)に問題があります。ここで同様の投稿をすべて読みましたが、答えは見つかりませんでした。同じメソッドをテストする2つのテストを含むクラスがあります。マッチャーを使っています。

  1. 単独で実行すると、各テストに合格します。
  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

これについての洞察は大歓迎です。

ありがとう、アン

17
Anne

私はまだ綿密に調べていませんが、これは疑わしいようです。

_String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
_

anyObject()はマッチャーであり、リプレイの後にafterと呼びます。オブジェクトの生成には使用されません。 EasyMockにオブジェクトをallowするように指示するために使用されます。 EasyMockは余分なマッチャーを検出していますが、2回目のテストまで害はありません。その時点で、EasyMockが記録したがまだ使用していないマッチャーの数(2)は、2番目のdoXthing呼び出しで予想されるパラメーターの数と一致しません(1)。

realパラメータをtestCallingXthing(または再生モードのモック)に渡す必要があります。 nullを直接渡すか、_2_のような実際の値を渡してみてください。

11
Mark Peters

私にとってこの失敗(私の場合は2つのマッチャーが予想され、4つが記録されています)は、「同じユニットテストでeasymockとmockitoを混合しているため、誤ってmockito引数に対してeasymockのnotNull()メソッドを呼び出しています。これは失敗を引き起こしますが、テストは特定の順序で実行されます。

4
rogerdpack

試してみてください:

_String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));
_

anyObject()よりも洗練されたマッチャーがあります。これらを使用すると、コラボレーターについて型ベースのアサーションを作成できます。

EasyMockのドキュメントから

eq(X value)
実際の値が期待値と等しい場合に一致します。すべてのプリミティブタイプとオブジェクトで使用できます。
anyBoolean()anyByte()anyChar()anyDouble()anyFloat()anyInt()anyLong()anyObject()anyShort()

2
nsfyn55

この問題を取り除くには、各テストメソッドの後にモックをリセットする必要があります。以下のコードを追加すると、この問題が解決します。

@After 
public void after(){
    EasyMock.reset(mockXthing)
}
0
user1371983