【问题标题】:EasyMock - Random tests failing - Matcher ExpectedEasyMock - 随机测试失败 - 预期匹配器
【发布时间】:2013-02-12 09:13:50
【问题描述】:

我对 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);

【问题讨论】:

  • 测试中有没有线程?

标签: java unit-testing easymock


【解决方案1】:

发现问题。我们不能使用 gt(0) 等方法将参数传递给正在测试的单元。

在另一个测试中我的错误使用了:

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

服务不是模拟,而是我正在测试的单元。

在检查文档时,我看到 gt(0l) 返回 0,这导致该测试通过其他测试失败。 (不知道为什么?)由于测试是随机执行的,随机条件失败了。

在测试开始时使用reset(mocks..) 没有任何帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2016-01-31
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多