2010-02-19 44 views
15

所以我一直在使用EasyMock的類擴展。突然我得到這個例外,但只有當我運行整個測試套件:在套件測試期間,EasyMock表示0匹配器預期1記錄

java.lang.IllegalStateException: 0 matchers expected, 1 recorded. 
at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:42) 
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:34) 
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:26) 
at org.easymock.internal.RecordState.invoke(RecordState.java:64) 
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:24) 
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:56) 
at org.easymock.classextension.internal.ClassProxyFactory$1.intercept(ClassProxyFactory.java:74) 
at com.protrade.soccersim.data.emulator.matrix.PositionCategoryMatrix$$EnhancerByCGLIB$$c5298a7.getPossession(<generated>) 
at com.protrade.soccersim.data.emulator.stats.team.PossessionCalculatorUnitTest.testDeterminePossessionHomeWin(PossessionCalculatorUnitTest.java:45) 

所涉及的代碼是這個小美女(修剪了一下):

@Before 
public void setUp() throws Exception { 
    homeTeam = createMock(PositionCategoryMatrix.class); 
    awayTeam = createMock(PositionCategoryMatrix.class); 
    ... 
} 

@Test 
public void testDeterminePossessionHomeWin() { 
    expect(homeTeam.getPossession()).andReturn(0.15151515); 
    expect(awayTeam.getPossession()).andReturn(0.01515152); 
    replay(homeTeam, awayTeam); 
    ... 
} 

異常正在被拋在第一個期望。它確實沒有道理。它說它獲得了一個匹配器,但該方法甚至沒有爭論。奇怪的是,它只在測試套件期間!我在@Before中創建了一個新的模擬器,所以它不應該從別的地方繼承任何東西(不是說某些其他方法會有匹配器)

那麼,有什麼想法?

+0

我也收到了這個(這個錯誤信息和其他所有類似谷歌搜索結果之間的主要區別在於記錄的數字比預期的數字要大......這表明它不是一個「丟失的匹配器」通過一個常量/匹配器組合)。這是關於EasyMock最簡單的用法 - 我以前從未遇到過這種情況? (我已經在2.5.2和3.0中試過了,結果相似。) – Jared 2010-08-04 15:42:18

回答

1

我遇到了類似的問題。從我觀察到的情況來看,甚至方法返回都使用匹配器進行匹配。所以如果你的第一個方法因任何原因失敗了,返回匹配的匹配器仍然在堆棧中。即使你的方法沒有任何爭論,這也可能是你看到1個匹配者記錄的原因之一。基本上,第一個方法調用從未返回值。

1

您正在使用哪個版本的Easymock?
我讀了關於post及v.2.5.2版本previuous的發佈可能有一個

愚蠢的錯誤上的捕獲

嘗試使用EasyMock的2.5.2+

4

雖然這可能是由於「愚蠢的」EasyMock錯誤導致的虛假信息,但它也很可能是由於EasyMock API的無效使用造成的。在我的情況下,消息從這個JUnit 3.8的測試產生(和你一樣,這隻有當我跑我的整個測試套件發生了,只能通過Maven的,不屬於Eclipse):

public void testSomething() { 
    // Set up 
    MyArgumentType mockArg = (MyArgumentType) EasyMock.anyObject(); // bad API usage 

    // Invoke the method under test 
    final String result = objectUnderTest.doSomething(mockArg); 

    // Verify (assertions, etc.) 
    ... 
} 

而不是使用anyObject的() ,我應該使用createMock(MyArgumentType.class)或其變體之一。我不知道我在想什麼,我已經寫了數百萬次這些測試並正確使用了API。

令人困惑的是,「錯誤的匹配器數量」消息失敗的測試不一定(或曾經)錯誤地使用過API。它可能是在包含replay()或verify()方法的錯誤行爲之後執行的第一個測試,但我沒有通過實驗驗證。

+0

這正是我們發生的事情。有人在'EasyMock.expect(...)'方法之外使用了一個匹配器,並且毒化了EasyMock狀態 – MusikPolice 2017-04-12 14:14:52

+0

有趣。請注意,我認爲整個Java世界已經轉向Mockito(需要引用),更加類型安全。 – 2017-04-18 02:24:30

+0

我已經被告知了很多,但在這一點上我們已經完成了超過1.5k的EasyMock測試,所以我們不太可能很快就會切換到 – MusikPolice 2017-04-18 14:32:19

2

我有相同的錯誤信息。我(意外地)在被測試的班級呼叫中使用了isA()聲明

I.e.

classUnderTest.callStateChanged(calls, isA(LoggingOnlyListener.class)); 

時,我的意思是:

classUnderTest.callStateChanged(calls, new LoggingOnlyListener()); 

而且這是在測試後這一個每次都失敗。

2

我剛剛遇到了這個問題,我想我設法弄清楚了。對我來說,這是因爲之前的測試(在不同的類中),我在Assert.assertEquals方法中使用EasyMock匹配器(不正確)。

看來EasyMock無法抱怨額外的匹配器報告,直到第一個期望的方法被調用。

9

我不耐煩地看到這與每個新的遺留代碼庫與EasyMock我不得不合作。在書中寫一個新的EasyMock測試,所有突然的隨機測試開始失敗,因爲Matchers從未捕獲。所以我開始研究EasyMock如何存儲這些Matchers。它使用了最後一個類LastControl,在那個類中有一些threadlocals,其中存儲了不同的東西。其中一個是Matchers。幸運的是,在那裏有一個靜態方法將所有Matcher從threadlocal中提取出來,然後在那裏。因此,這給了我這個想法(有collegue的幫助,感謝斯文,他想貸款)

/** 
* Base class to make sure all EasyMock matchers are cleaned up. This is not pretty but it will work 
* 
* @author N069261KDS 
* 
*/ 
public class BaseTest { 

    @Before 
    public void before(){ 
    LastControl.pullMatchers(); 
    } 

    @After 
    public void after(){ 
    LastControl.pullMatchers(); 
    } 

} 

Basicly讓你的測試與匹配器錯誤無法從這個類擴展,你一定會匹配器是清洗。請注意這是一個替代方法。首先應該寫出有問題的測試。但是如果你必須通過5000多次測試,這是兩個弊端中較小的一個。我希望這會幫助人們出去!

+0

這就像一個魅力! – 2016-04-19 10:38:19

相關問題