Mockito - 参数Captor没有捕捉,没有互动

时间:2014-12-02 17:11:55

标签: java junit mockito error-logging

我正在研究一些不能很好地处理异常的旧代码。我正在写的一个测试,存根抛出异常的方法,我需要确认是正确的异常。测试此异常的唯一方法是在记录时捕获参数并比较字符串。

当我跑步时,我得到:

想要但未被调用: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对象的方法。这是我第一次使用参数捕获器,所以希望我只是遗漏了一些明显的东西。

1 个答案:

答案 0 :(得分:1)

  

final Logger logger = mock(Logger.class);

这是您在本地为测试方法创建的记录器实例;因此,您正在测试的课程不会使用它。您至少需要spy()实际的记录器实例。

此外,您执行之后verify() (我猜这里_task.run()执行将触发异常的代码);这意味着,即使您在正确的Logger实例上进行了间谍活动,当您verify()时,也没有任何内容。

所以:

  • 实际上模拟或间谍_task;
  • 使用的实际记录器
  • 验证模拟/间谍互动(Mockito.verify()适用于两者)执行完该方法之后。