2013-02-12 83 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..)没有任何帮助。