gpt4 book ai didi

java - Mockito - Argument Captor 未捕获且没有交互

转载 作者:行者123 更新时间:2023-12-01 12:11:24 24 4
gpt4 key购买 nike

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

当我运行这个时,我得到:

需要但未调用:logger.error(Capturing argument)

实际上与此模拟的交互为零

@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 对象的方法。这是我第一次使用参数捕获器,所以希望我只是错过了一些明显的东西。

最佳答案

final Logger logger = mock(Logger.class);

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

更重要的是,您verify()执行之后(我猜这里_task.run()执行的代码将触发异常);这意味着,即使您监视了正确的 Logger 实例,在您 verify() 时,也不会出现任何结果。

所以:

  • 实际上是模拟或监视 _task 使用的实际记录器;
  • 在执行该方法之后验证模拟/ spy 交互(Mockito.verify() 适用于两者)。

关于java - Mockito - Argument Captor 未捕获且没有交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27255084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com