2014-12-02 2 views
0

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

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

Wanted, но не вызывается: 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); 
    } 

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

ответ

1

final Logger logger = mock (Logger.class);

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

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

Итак:

  • фактически фиктивный, или шпион, фактический регистратор, используемый _task;
  • проверять взаимовыгодные/шпионские взаимодействия (Mockito.verify() работает для обоим) после вы выполнили метод.
+0

Большой проблемой был регистратор. Как только я получил это, все остальное встало на свои места. Спасибо. – Chad

Смежные вопросы