gpt4 book ai didi

java - 如何将 ArgumentCaptor 与 Mockito.when().thenReturn() 结合使用

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:10 31 4
gpt4 key购买 nike

我有一个用例,我想捕获方法中传递的值,并使用该值来定义 Mockito 行为。

像这样:

@InjectMocks
private ClassUnderTest classUnderTest;

@Mock
private MockedClass mockedClass;

@Captor
private ArgumentCaptor<ArgumentUsedInMockedClass> captor;

@Test
public void testMethod() {
Result result = new Result();
result.setResultId(RESULT_ID);

Mockito.verify(mockedClass).doSomething(captor.capture());

Mockito.when(mockedClass.doSomething(captor.getValue())).thenReturn(result);

Assert.assertTrue(classUnderTest
.doSomething(foo, bar)
.equals(result));
}

但是我收到了这个错误:

[junit] Wanted but not invoked:
[junit] mockedClass.doSomething(
[junit] <Capturing argument>
[junit] );
[junit] Actually, there were zero interactions with this mock.

在我的 doSomething() 函数中,foo 和 bar 用于生成 ArgumentUsedInMockedClass 类型的参数。现在,这个 ArgumentUsedInMockedClass 类型没有正确定义它的 equals() ,因此如果我试图直接使用

它就会失败

Mockito.when(mockedClass.doSomething(argumentUsedInMockedClass)).thenReturn(result); 在测试方法中生成 argumentUsedInMockedClass,即使它的参数相同。我正在 try catch 在此 ClassUnderTest 中创建的确切对象以定义 mockito 行为,但在我看来它就像一个循环,其中首先

Assert.assertTrue(classUnderTest
.doSomething(foo, bar)
.equals(result));

必须碰巧实际捕获,但要使其工作 mockedClass 行为应该被定义,这取决于它。

如何解决这种情况或使用其他测试方法?

最佳答案

您收到错误是因为您尝试在方法实际调用之前验证它是否被调用,这发生在 assertTrue 中。

你可以这样重写你的测试:

@Test
public void testMethod() {
Result result = new Result();
result.setResultId(RESULT_ID);

// Define the behavior
Mockito.when(mockedClass.doSomething(any(ArgumentUsedInMockedClass.class)).thenReturn(result);

Assert.assertTrue(classUnderTest
.doSomething(foo, bar)
.equals(result));
Mockito.verify(mockedClass).doSomething(captor.capture());
ArgumentUsedInMockedClass argument = captor.getValue();
// Do some further verification/assertion with argument
}

关于java - 如何将 ArgumentCaptor 与 Mockito.when().thenReturn() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41167450/

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