想要但没有 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")
使用 @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());
}
}
我正在尝试在 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")
使用 @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());
}
}