EasyMock AssertionError при вызове Logger.error(String, Throwable)
Я вижу ошибку подтверждения при включении Throwable при вызове метода Log4j.error. У меня есть Logger.class, PrintWriter.class, AuthenticationException.class в блоке @PreparateForTest. Я не вижу ошибки, если я не передаю 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 ответа
Вы получаете 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
Надеюсь, поможет!
Удачи!
LOGGER.error("SOME MESSAGE HERE", ex);
Эта строка, кажется, вызывает printStacktrace
метод ex
то есть AuthenticationException
тип. Так как вы имитировали его, вы должны сообщить поведению, с которым должен вести себя объект (фиктивно, технически), когда встречается этот вызов.
У вас есть 3 варианта, кроме отдыха verification
конечно через использование nice mocks
, если вы действительно ожидаете, что это исключение будет выдано (ваш вопрос немного расплывчат)
Посмотрим, можете ли вы ожидать
LOGGER.error("SOME MESSAGE HERE", ex);
то есть издеватьсяLOGGER
,LOGGER
кажетсяstatic
переменная, но вы, кажется, используетеPowermock
Так что я не думаю, что у вас будут проблемы с издевательством, но если у вас есть проблемы с издевательствомLOGGER
, читать дальшеРасскажи
Easymock
как он должен реагировать, когда сталкивается сprintStacktrace
вызов метода на фиктивном объектеmockAuthException
поместив ожидание на это, как это (printStacktrace
бытьvoid
метод) перед вамиreplay
издеватьсяmockAuthException.printStacktrace(); expectLastCall().andDoSomethingIfNeeded();
Не издевайтесь
AuthenticationException
печатать вообще, если это не является абсолютно необходимым - похоже, вы можете обойтись без насмешек, скажем, путем созданияStub
типа.