当我在调用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;
}
答案 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
模拟之前,printStacktrace
是void
方法:
replay
根本不要嘲笑mockAuthException.printStacktrace(); expectLastCall().andDoSomethingIfNeeded();
类型,除非它绝对必要 - 看起来你可以做而不用嘲笑它,比如说,创建{{1}类型。