2011-07-01 23 views
13

EasyMock 2.5.2およびJUnit 4.8.2(Eclipseを介して実行中)に問題があります。私はここにすべての同様の記事を読んだが、答えを見つけていない。同じメソッドをテストする2つのテストを含むクラスがあります。私はマッチャーを使用しています。EasyMock:java.lang.IllegalStateException:1マッチャーが予想され、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); 
} 

java.lang.IllegalStateException: 1 matchers expected, 2 recorded 

これに任意の洞察力があろう大いに感謝します。

おかげで、 アン

+0

どのラインがその例外をスローしますか? –

+0

申し訳ありません - 2番目(または最後)のテストで-EasyMock.expect(mockXthing.doXthing((String)EasyMock.anyObject()))。andReturn(xyz); – Anne

+0

ええ、私はそれが私の答えが言うことだと思います。 –

答えて

9

私は密接にまだ細かいところまで見ていないが、これが容疑者になります。

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject()); 

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

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

+0

あなたは正しいです!あなたが投稿した行のマッチャーを使用する必要はありませんでした。私はちょうど実際のオブジェクトまたはnull(実際のテストコードは4つのパラメータがあります)を渡すことができます。どうもありがとうございます。 – Anne

2

試してみてください。

String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong())); 

anyObject()より洗練されたmatcherがあります。これらを使用すると、共同作業者に関するタイプベースのアサーションを作成できます。 EasyMock documentationから

:私のこの障害の

eq(X value)
Matches if the actual value is equals the expected value. Available for all primitive types and for objects.
anyBoolean() , anyByte() , anyChar() , anyDouble() , anyFloat() , anyInt() , anyLong() , anyObject() , anyShort()

3

(。私の場合2マッチャで期待される、4は記録)あなたがそう偶然呼び出し、同じユニットテストでeasymockとmockitoを混合している」意味しましたMockito引数のeasymockのnotNull()メソッドエラーが発生するのはテストが特定の順序で実行された場合のみです

+0

私はこれも私のケースだと思います。私はマークの答えを試して、それは動作しませんでした。テストは断続的に失敗します。純粋にMockitoでテストを書き直すつもりです。 – xli

+0

私の場合、私はアサルトでハムクレスト・マターの代わりにEasymockマッチャーを使用しました。リセットして正しい順序で再生しても、それを記録していて次のテストが失敗する原因となりました。これは私がそれを見つけるのを助けた。 – twinj

0

この問題を解決するには、各テストメソッドの後にモックをリセットする必要があります。この問題。

@After 
public void after(){ 
    EasyMock.reset(mockXthing) 
} 
関連する問題