调用Logger.error时的EasyMock AssertionError(String,Throwable)

时间:2014-12-31 19:07:59

标签: log4j easymock printstacktrace

当我在调用Log4j.error方法时包含Throwable时,我看到断言错误。我在@PreparateForTest块中有Logger.class,PrintWriter.class,AuthenticationException.class。如果我没有将Throwable作为参数传递,我不会看到错误。

在正确设置模拟时我缺少什么?

    Caused by: java.lang.AssertionError: 
      Unexpected method call AuthenticationException.printStackTrace(java.io.PrintWriter@2c64e8ad):
            at org.junit.Assert.fail(Assert.java:93)
            at com.xxx.yy.security.client.ClientTest.authenticateFail(ClientTest.java:282)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:606)
            at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
            ... 23 more

JUnit测试代码片段如下:

    AuthenticationException mockAuthException = PowerMock
                        .createMock(AuthenticationException.class);
    PrintWriter mockPrintWriter = PowerMock
                        .createMock(PrintWriter.class);
    Logger mockLogger = PowerMock.createMock(Logger.class);
    String message = "blah";
    mockLogger.error(message, mockAuthException);
    EasyMock.expectLastCall();

    mockAuthException.printStackTrace(mockPrintWriter);
    EasyMock.expectLastCall();

导致此问题的代码段如下:

    try{
    .
    .
    }catch (AuthenticationException ex) {
        LOGGER.error("SOME MESSAGE HERE", ex);
        throw ex;
    }

2 个答案:

答案 0 :(得分:1)

你得到的Unexpected method call error可以解决如下:

AuthenticationException mockAuthException = EasyMock.createNiceMock(AuthenticationException.class);
PrintWriter mockPrintWriter = EasyMock.createNiceMock(PrintWriter.class);
Logger mockLogger = EasyMock.createNiceMock(Logger.class);
String message = "blah";
mockLogger.error(message, mockAuthException);
EasyMock.expectLastCall();

mockAuthException.printStackTrace(mockPrintWriter);
EasyMock.expectLastCall();

这里的更改是使用easymock而不是powermock,并创建一个niceMock而不是普通的mock。

createMock(..)方法是严格的,无法识别方法是否在内部调用,但是当您使用createNiceMock(..)时,此检查将被忽略,并且您不会收到UnexpectedMethodCall错误

希望它有所帮助!

祝你好运!

答案 1 :(得分:0)

LOGGER.error("SOME MESSAGE HERE", ex);

此行似乎是调用printStacktrace的{​​{1}}方法,即ex类型。既然你已经嘲笑过它,那么当遇到这个调用时,你必须告诉对象(技术上是模拟的)应该处理的行为。

除了通过使用AuthenticationException放宽verification之外,您有3个选择,假设您真的希望抛出此异常(您的问题对此有点模糊):< / p>

  • 看看你是否可以期待nice mocks,即模仿LOGGER.error("SOME MESSAGE HERE", ex);LOGGER似乎是LOGGER变量,但您似乎正在使用static,所以我不认为您会嘲笑它,但如果你确实有嘲笑Powermock的问题,请阅读

  • 告诉LOGGER当它遇到模拟对象Easymock上的printStacktrace方法调用时它应该如何响应,方法是对它进行预期(如下所示)在mockAuthException模拟之前,printStacktracevoid方法:

    replay

  • 根本不要嘲笑mockAuthException.printStacktrace(); expectLastCall().andDoSomethingIfNeeded();类型,除非它绝对必要 - 看起来你可以做而不用嘲笑它,比如说,创建{{1}类型。