我有以下服务类别:
class Person() {
AgeDAO dao;
Speaker speaker;
public method checkSpeak( List<Jon> list) {
List<Integer> ages = dao.getAge(list);
if ( ages != null && !ages.isEmpty() ) {
speaker.speak(list);
}
}
}
测试类:
@Test
class MyTest {
void speakTest() {
Person p = new Person();
Speaker speaker = mock(Speaker.class);
p.speaker = speaker;
AgeDAO dao = mock(AgeDAO.class);
p.dao = dao;
List<Jon> list = createJonList();
List<Integer> ages = createAgesList();
when(dao.getAge(anyList())).thenReturn(ages);
p.checkSpeak(ages);
verify(p.speaker).speak(anyList()); // This is not called/invoked.
}
}
我只想验证 speak
是否被调用。我还应该 mock 这个方法吗?如果我需要模拟该方法,如何模拟不返回任何内容的方法。 when
要求方法返回某些内容。
最佳答案
您发布的代码中存在一些小问题(最明显的是: checkSepak
采用 List<Jon>
但您的代码传递 ages
这是 List<Integer>
)。
修复这些问题后,我意识到测试失败了,因为 ages
由测试创建的列表(并用作 dao.getAges()
的返回值)为空。因此,条件ages != null && !ages.isEmpty()
不满足,这使得代码跳过 speaker.speak()
打电话。
显而易见的解决方案是使 ages
通过添加一些元素来列表非空:
public class MyTest {
@Test
public void speakTest() {
Person p = new Person();
Speaker speaker = mock(Speaker.class);
p.speaker = speaker;
AgeDAO dao = mock(AgeDAO.class);
p.dao = dao;
List<Jon> list = createJonList();
List<Integer> ages = createAgesList();
ages.add(5); // Make the list of ages non-empty
when(dao.getAge(anyList())).thenReturn(ages);
p.checkSpeak(list);
verify(p.speaker).speak(anyList());
}
private List<Integer> createAgesList() {
return new ArrayList<Integer>();
}
private List<Jon> createJonList() {
return new ArrayList<Jon>();
}
}
class Person {
AgeDAO dao;
Speaker speaker;
public void checkSpeak(List<Jon> list) {
List<Integer> ages = dao.getAge(list);
if (ages != null && !ages.isEmpty()) {
speaker.speak(list);
}
}
}
关于java - mockito - 检查条件是否通过并调用不返回任何内容的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765296/