gpt4 book ai didi

java - mockito 验证与 ArgumentCaptor 的交互

转载 作者:IT老高 更新时间:2023-10-28 20:33:28 24 4
gpt4 key购买 nike

要检查与方法调用中的参数属于某种类型的模拟的交互次数,可以这样做

mock.someMethod(new FirstClass());
mock.someMethod(new OtherClass());
verify(mock, times(1)).someMethod(isA(FirstClass.class));

这要归功于对 isA 的调用,因为 someMethod 被调用了两次,但只有一次使用参数 FirstClass

然而,当使用 ArgumentCaptor 时,这种模式似乎是不可能的,即使 Captor 是为特定参数 FirstClass

创建的

这不起作用

mock.someMethod(new FirstClass());
mock.someMethod(new OtherClass());
ArgumentCaptor<FirstClass> captor = ArgumentCaptor.forClass(FirstClass.class);
verify(mock, times(1)).someMethod(captor.capture());

它说模拟被多次调用。

在捕获参数以供进一步检查时,有什么方法可以完成此验证?

最佳答案

我建议使用 Mockito 的 Hamcrest 集成为它编写一个好的、干净的匹配器。这允许您将验证与传递参数的详细检查结合起来:

import static org.mockito.hamcrest.MockitoHamcrest.argThat;

verify(mock, times(1)).someMethod(argThat(personNamed("Bob")));

Matcher<Person> personNamed(final String name) {
return new TypeSafeMatcher<Person>() {
public boolean matchesSafely(Person item) {
return name.equals(item.getName());
}
public void describeTo(Description description) {
description.appendText("a Person named " + name);
}
};
}

匹配器通常会导致更易读的测试和更有用的测试失败消息。它们也往往是非常可重用的,您会发现自己建立了一个为测试您的项目量身定制的库。最后,您还可以使用 JUnit 的 Assert.assertThat() 将它们用于正常的测试断言,因此您可以双重使用它们。

关于java - mockito 验证与 ArgumentCaptor 的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204453/

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