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 типа.

Другие вопросы по тегам