【问题标题】:easymock throws assertionError with expectaction failed on verifyeasymock 抛出 assertionError 与期望操作在验证失败
【发布时间】:2014-07-18 07:20:10
【问题描述】:

我有想要测试的这个方法。

protected RestResponseStatus validate(INotificationValidator... validations) {
    RestResponseStatus resp = null;
    for (INotificationValidator validation : validations) {
        if (!validation.isValid()) { // <- need to test this
            resp = validation.createErrorResponseStatus();
            break;
        }
    }
    return resp;
}

为了测试它,我创建了类,并用这个方法用类扩展了它,并创建了测试方法

@Test
public void nonValidBranchTest() {
    ParameterValidator validator = createMock(ParameterValidator.class);
    validator.isValid();
    expectLastCall().andReturn(false);
    replay(validator);

    this.validate(new ParameterValidator(TEST_STRING));
    verify(validator);

}

但是当我尝试运行测试时 - 我遇到了一个错误

java.lang.AssertionError: 
   Expectation failure on verify:
     ParameterValidator.isValid(): expected: 1, actual: 0

【问题讨论】:

    标签: java easymock


    【解决方案1】:

    为什么不将验证器模拟传递给 validate 方法?

    ParameterValidator validator = createMock(ParameterValidator.class);
    validator.isValid();
    expectLastCall().andReturn(false);
    replay(validator);
    
    this.validate(validator);
    verify(validator);
    

    如果您创建一个新的 ParameterValidator 实例,当然永远不会调用模拟。

    据我了解...您想测试validate 方法是否在验证器上调用isValid,如果它返回false,则调用validation.createErrorResponseStatus

    因此,您还应该记录该行为

    RestResponseStatus expectedRespStatus = createMock(RestResponseStatus.class);
    ParameterValidator validator = createMock(ParameterValidator.class);
    validator.isValid();
    expectLastCall().andReturn(false);
    validator.createErrorResponseStatus().andReturn(expectedRespStatus);
    expectLastCall();
    replay(validator);
    replay(expectedRespStatus);
    
    RestResponseStatus respStatus = this.validate(validator);
    assertSame(expectedRespStatus, respStatus);
    verify(validator);
    

    【讨论】:

    • 现在我有Unexpected method call ParameterValidator.createErrorResponseStatus()
    • 哦!我懂了。我想我应该只测试一个方法调用。
    • 现在我有missing behavior definition for the preceding method call: ParameterValidator.createErrorResponseStatus() Usage is: expect(a.foo()).andXXX() 所以我也应该返回createErrorResponseStatus 吗?
    • 是的,这是因为该方法返回一个 RestResposneStatus 并且您必须说明应该返回哪个对象。我更新了我的答案。
    【解决方案2】:

    您应该在测试类中创建要测试的对象的实例,而不是扩展它。测试类通常不会扩展被测类,而是镜像 src\main\test 下的包结构,以便您可以访问受保护的方法。

    有 0 个调用的原因是您调用的是 this.validate,它在 MyClassTest 而不是 MyClass 上执行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多