我正在研究一些不能很好地处理异常的旧代码。我正在写的一个测试,存根抛出异常的方法,我需要确认是正确的异常。测试此异常的唯一方法是在记录时捕获参数并比较字符串。
当我跑步时,我得到:
想要但未被调用: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对象的方法。这是我第一次使用参数捕获器,所以希望我只是遗漏了一些明显的东西。
答案 0 :(得分:1)
final Logger logger = mock(Logger.class);
这是您在本地为测试方法创建的记录器实例;因此,您正在测试的课程不会使用它。您至少需要spy()
实际的记录器实例。
此外,您执行之后verify()
(我猜这里_task.run()
执行将触发异常的代码);这意味着,即使您在正确的Logger
实例上进行了间谍活动,当您verify()
时,也没有任何内容。
所以:
_task
; Mockito.verify()
适用于两者)在执行完该方法之后。