2013-02-12 46 views
0

我有一個奇怪的問題,EasyMock的EasyMock的 - 隨機測試失敗 - 匹配器預計

這就是我正在做的調用,它拋出一個IllegalStateException : Matcher expected預期

expect(this.mock.expectedOperation(gt(0l), MyClass.class)).andReturn(createClassObject()); 

如果我更換了與上述電話

expect(this.mock.expectedOperation(gt(0l), createClass(MyClass.class))).andReturn(createClassObject()); 

@SuppressWarnings("unchecked") 
public static <T> Class<T> createClass(Class<T> clazz) 
{ 
    return (Class<T>) EasyMock.anyObject(); 
} 

大多數時候我沒有得到一個錯誤,但有時我做的。它保持IllegalStateException : Matcher expected ..

有時我得到IllegalStateException : 2 Matchers expected 1 recorder錯誤這樣做的:

MyClass object = createClassObject(); 
expect(this.mock.expectedOperation(anyLong(), anyLong()).andReturn(object); 

public MyClass createClassObject() { 
    // Actually sets properties and then returns 
    return new MyClass(); 
} 

但我做到這一點,當它運行:

expect(this.mock.expectedOperation(anyLong(), anyLong()).andReturn(createClassObject()); 

在上面的例子中,有時前者運行和後者失敗。

有時失敗:

MyClass object = createClassObject(); 
expect(this.mock.expectedOperation(1, MyClass.class)).andReturn(object); 

我有四重檢查復位,重播,通話驗證。 這些測試有時會運行,有時會失敗。

如果我運行我的單元測試,它至少會在上述任何一種情況下失敗一次。爲什麼?我如何讓它運行?

編輯:我使用EasyMock的3.1版和

MockedClass mock = EasyMock.createMock(MockedClass.class); 
+0

測試中涉及的任何線程? – 2013-02-12 09:17:58

+0

不是。沒有線程。 – 2013-02-12 09:18:31

回答

0

發現問題。我們不能使用gt(0)等方法將參數傳遞到正在測試的單元中。

在用我的錯誤另一個測試使用過:

service.performOperation(1, gt(0l)); 

服務不是模擬,但單位我測試。

在檢查文檔時,我看到gt(0l)返回0,這導致此測試通過其他人失敗。 (不知道爲什麼?)由於測試隨機執行,隨機條件失敗。

在測試開始時使用reset(mocks..)沒有任何幫助。