java - mockito - 检查条件是否通过并调用不返回任何内容的方法

标签 java methods mockito invoke stub

我有以下服务类别:

 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/

相关文章:

java - 从服务器更新 Strings.xml - Android SDK

java - 在同步块(synchronized block)的 run() 内部使用 this.wait()

unit-testing - 如何测试在 Kotlin 中调用顶级函数的代码?

java - spring中线程提交任务,不等待完成

python - 为什么 PyQt 类的反弹方法会引发 TypeError

java - "implement a wrapper method"是什么意思?

java - ForkJoinPool 中的 Execute 、 Submit 和 Invoke() 之间的区别

mockito - JUnit 用于带有 while 循环的方法

java - 如何验证只使用预期参数调用方法?

java - 最小值并发映射