2011-07-01 40 views
13
我有EasyMock的2.5.2和JUnit 4.8.2一個問題

(通過Eclipse中運行)。我已閱讀所有類似的帖子,但沒有找到答案。我有一個類包含兩個測試同樣的方法。我正在使用匹配器。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

對不起 - 第二次(或最後一次)測試-EasyMock.expect(mockXthing.doXthing((String)EasyMock.anyObject()))。andReturn(XYZ); – Anne

+0

好吧,我認爲這就是我的答案然後。 –

回答

9

我還沒有認真仔細地看了看還沒有,但是這看起來可疑:

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

anyObject()是一個匹配,你叫它重播後。它不用於生成任何對象。它用於指示EasyMock允許允許任何對象。 EasyMock正在檢測那個額外的匹配器,但它在第二次測試之前是無害的。此時,EasyMock已記錄但尚未使用的匹配器數量(2)與第二次調用(1)期望的參數數量並不一致。

您應該將real參數傳遞給testCallingXthing(或處於重放模式的模擬)。嘗試在null直接傳遞,或像2一個真正的價值。

+0

你是對的!我不需要在你發佈的行中使用匹配器。我只能傳遞真實的對象,甚至是空的(真正的測試代碼有4個參數)。非常感謝。 – Anne

2

嘗試:

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

有更精緻的匹配比anyObject()。這些允許您對協作者進行基於類型的斷言。

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在同一單元測試,所以無意調用easymock的notNull()方法用於mockito參數。只有當測試以特定順序運行時,纔會導致失敗。

+0

我相信這也是我的情況。我試過Mark的回答,但沒有奏效。測試仍然間歇性失敗。我將純粹在Mockito中重寫這些測試。 – xli

+0

對我來說,我在斷言中使用了一個Easymock匹配器而不是Hamcrest macther。即使我按照正確的順序重新設置並重放,但它們正在記錄它們並導致下一次測試失敗。這幫助我找到了它。 – twinj

0

您應該在每種測試方法之後重置模擬以擺脫此問題。這個問題。

@After 
public void after(){ 
    EasyMock.reset(mockXthing) 
} 
相關問題