想要但没有调用:Mockito

Sau*_*ngh 0 java junit mockito

我正在尝试在 Vote.java 下面进行测试,它有一个名为 isEligibleToVote() 的方法,该方法在检查后又调用另一个方法 getResult() 。我试图捕捉论点并断言,但在这样做的同时我得到了Wanted but not invoked: vote.getResult(<Capturing argument>);

我明白这是因为vote.isEligibleToVote(18);我已经使用 @Mock 声明了投票,这是不正确的,但我不知道如何使用 ArgumentCaptor 测试此类并验证方法。

投票.java

public class Vote {
public void isEligibleToVote(int age){
    if(age>18)
        getResult("yes");
    else
        getResult("no");

}

public String getResult(String result){
    return result;
}
Run Code Online (Sandbox Code Playgroud)

}

投票测试.java

@ExtendWith(MockitoExtension.class)
public class VoteTest {

    @Mock
    Vote vote;

    @Test
    public void isEligibleToVote_test(){
        ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class);
        vote.isEligibleToVote(18);
        verify(vote).getResult(stringArgumentCaptor.capture());
        assertEquals("yes", stringArgumentCaptor.getValue());
    }
}
Run Code Online (Sandbox Code Playgroud)

错误堆栈跟踪

    Wanted but not invoked:
vote.getResult(<Capturing argument>);
-> at VoteTest.isEligibleToVote_test(VoteTest.java:24)

However, there was exactly 1 interaction with this mock:
vote.isEligibletoVote(18);
-> at VoteTest.isEligibleToVote_test(VoteTest.java:23)


Wanted but not invoked:
vote.getResult(<Capturing argument>);
-> at VoteTest.isEligibleToVote_test(VoteTest.java:24)

However, there was exactly 1 interaction with this mock:
vote.isEligibletoVote(18);
-> at VoteTest.isEligibleToVote_test(VoteTest.java:23)


    at VoteTest.isEligibleToVote_test(VoteTest.java:24)
Run Code Online (Sandbox Code Playgroud)

我知道 vote 是模拟的,但我想知道如何调用 vote.iseligibleTovote(18) 并从 if 和 else 条件内部获取 getResult 的参数

tom*_*ty3 6

使用@Spy而不是@Mock进行验证。您必须调用when()您没有执行的模拟对象的任何方法,因此需要但未调用