想要但没有 invoked:Mockito

Wanted but not invoked:Mockito

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

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

Vote.java

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

}

public String getResult(String result){
    return result;
}

}

VoteTest.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());
    }
}

错误 Staacktrace

    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)

我知道投票是模拟的,但我想知道如何调用 vote.iseligibleTovote(18) 并从 if 和 else condition

中获取 getResult 的参数

你的投票是模拟的,你不能对他调用方法。

看看什么时候when(vote.isEligibleToVote(18)).thenReturn("WHat you want")

编辑:查看https://www.baeldung.com/mockito-behavior

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

TLDR:使用 @Spy 代替 @Mock

@Mock 用于模拟一个对象并将其插入到另一个对象中。
@Spy 用于查看中间值。在你的情况下 getResult()

使用下面的代码可以更好地理解:

@RunWith(MockitoJUnitRunner.class)
public class VoteTest {

    @Spy
    Vote vote;

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