ArgumentCaptor

2025年3月17日 | 阅读 3 分钟

AgrumentCaptor 是在 org.mockito 包中定义的类。 它用于捕获参数值以进行进一步的断言。 我们将 argument captor 与诸如 verify() 或 then() 之类的方法一起使用,以获取调用特定方法时传递的值。

以下是ArgumentCaptor类的一些重要方法

方法类型和方法名描述
T capture()它用于捕获方法参数。
ArgumentCaptor<U> forClass(Class<S>clazz)它用于构建一个新的ArgumentCaptor。
List<T> getAllValues()它用于返回所有捕获的值。
T getValue()它用于返回参数的所有捕获值。

建议将ArgumentCaptor与验证一起使用,而不要与存根一起使用。 因为使用存根会降低测试的可读性,因为 captor 是在断言(验证或 then)块之外定义的。

ArgumentCaptor 示例

在这里,我们将使用 BDD 样式创建一个 ArgumentCapture 的示例。 在此示例中,我们使用 then().should() 方法代替 BDDMockito 类中可用的 verify() 方法。 使用它们的主要目的是使代码更具可读性和理解性。

步骤 1:创建一个名为 ToDoService 的接口,其中包含两个未实现的方法。

ToDoService.java

步骤 2:创建名为 ToDoBusinessToDoService 接口的实现类。

ToDoBusiness.java

步骤 3:创建一个名为 ToDoBusinessMock 的模拟类,用于测试。 在这里,我们声明了一个 ArgumentCaptor,当调用 deleteTodos() 方法时,它会捕获此 (todoService) 模拟的参数。

ToDoBusinessMock.java

在上面的代码中,我们捕获了参数,并通过使用 getValue() 方法检查传递的参数是否为 "Use Spring MVC"

输出

ArgumentCaptor

考虑一种情况,我们需要同时删除多个值。 在这种情况下,使用名为 getAllValues() 的方法,如下所示。

但是上面的代码将抛出一个异常,如下所示。

ArgumentCaptor

要删除上面的异常,我们需要指定应该调用该方法的次数。 假设列表中有两个非 Hibernate 项可用,因此我们需要调用该方法两次,如下所示。

输出

ArgumentCaptor
下一主题Hamcrest Matchers