Mockito - Argument Captor не захватывает и не взаимодействует

Я работаю над старым кодом, который не очень хорошо обрабатывает исключения. Один тест, который я пишу, заглушает метод, который выдает исключение, которое мне нужно подтвердить, является правильным исключением. Единственный способ проверить это исключение, которое я вижу, — это зафиксировать аргумент, когда он регистрируется, и сравнить строки.

Когда я запускаю это, я получаю:

Разыскивается, но не вызывается: logger.error (аргумент захвата)

На самом деле с этим макетом не было никаких взаимодействий.

@Test
public void testRunCipherThrowsException() throws Exception
{
    final Logger logger = mock(Logger.class);
    ArgumentCaptor<Logger> argument = ArgumentCaptor.forClass(Logger.class);

    when(cipher.doSomething(any(byte[].class))).thenThrow(new IllegalBlockSizeException("Bad block size"));
    Mockito.verify(logger).error(argument.capture());

    _task.run();

    assertEquals("The execution failed.  Details: Bad block size", argument.getValue().getName());
}

Вот фрагмент из класса, который я тестирую - в отладке я каждый раз нажимаю эту строку кода.

try
{

final byte[] result = cipher.doSomething(testData);

catch (final Exception ex)
    {
        _consequtiveFailures++;
        _logger.error("The execution failed.  Details: " + ex.getMessage(), ex);
    }

Я пытался организовать тест несколькими способами, думая, что проверка может быть настроена неправильно. Я также пробовал несколько разных способов настройки фиктивного объекта Logger. Я впервые использую средство захвата аргументов, поэтому, надеюсь, я просто упускаю что-то очевидное.


person Chad    schedule 02.12.2014    source источник


Ответы (1)


окончательный Logger logger = макет (Logger.class);

Это экземпляр регистратора, который вы создали локально для своего метода тестирования; поэтому он не будет использоваться тестируемым классом. Вам нужно как минимум spy() фактический экземпляр регистратора.

Более того, вы verify() после выполнения (я предполагаю, что _task.run() выполняет код, вызывающий исключение); а это значит, что даже если вы подсмотрели правильный экземпляр Logger, в момент, когда вы его verify(), ничего не будет.

So:

  • на самом деле издевается или шпионит за реальным регистратором, используемым _task;
  • проверьте фиктивное/шпионское взаимодействие (Mockito.verify() работает для обоих) после выполнения метода.
person fge    schedule 02.12.2014
comment
Большой проблемой был регистратор... как только я это сделал, все остальное встало на свои места. Спасибо. - person Chad; 02.12.2014