【问题标题】:Mockito - Argument Captor not capturing and no interactionsMockito - Argument Captor 未捕获且没有交互
【发布时间】:2015-01-31 00:48:56
【问题描述】:

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

当我运行它时,我得到:

需要但未调用: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());
}

这是我正在测试的类中的一个 sn-p - 在调试中,我每次都打那行代码。

try
{

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

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

我尝试以几种不同的方式安排测试,认为验证可能无法正确设置。我还尝试了几种不同的设置模拟 Logger 对象的方法。这是我第一次使用参数捕获器,所以希望我只是遗漏了一些明显的东西。

【问题讨论】:

    标签: java junit mockito error-logging


    【解决方案1】:

    最终的 Logger logger = mock(Logger.class);

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

    还有,你verify()之后你执行(我猜这里_task.run()执行了会触发异常的代码);这意味着即使您监视了正确的 Logger 实例,在您 verify() 它时,也不会有任何东西。

    所以:

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

    【讨论】:

    • 最大的问题是记录器......一旦我开始了,其余的就到位了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多