我正在处理一些不能很好地处理异常的旧代码。 我正在编写的一个测试,存根一个引发异常的方法,我需要确认它是正确的异常。 测试我可以看到的此异常的唯一方法是在记录参数时捕获参数并比较字符串。
当我运行这个时,我得到:
想要但未调用: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);
}
我尝试以几种不同的方式安排测试,认为验证可能没有正确设置。 我还尝试了几种不同的方法来设置模拟记录器对象。 这是我第一次使用参数捕获器,所以希望我只是错过了一些明显的东西。
最终记录器记录器 = 模拟(记录器.class);
这是您在本地为测试方法创建的记录器实例;因此,您正在测试的类不会使用它。您至少需要spy()
实际的记录器实例。
更重要的是,你在执行后verify()
(我猜这里_task.run()
执行将触发异常的代码);这意味着即使你监视了正确的Logger
实例,在你verify()
它的时候,也不会有任何内容。
所以:
- 实际上模拟或监视
_task
使用的实际记录器; - 执行方法后验证模拟/间谍交互(
Mockito.verify()
对两者都有效)。