0

我有以下服务等级:

 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被调用。我还应该嘲笑这个方法吗?如果我需要模拟该方法,如何模拟不返回任何内容的方法。when需要一个方法返回一些东西。

4

3 回答 3

2

您发布的代码中有一些小问题(最值得注意的是:checkSepak接受 aList<Jon>但您的代码正在传递ages,它是 a 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);
    }
  }
}
于 2013-07-20T21:06:14.410 回答
0

你可以用doNothing模拟 speak 方法

于 2013-07-20T18:41:00.973 回答
0

我认为您不需要为 Speaker 模拟该对象,因为您仅将“when”用于 dao。除非 Speaker 有需要模拟的对象会导致 speak 方法失败,否则您不应该模拟 Speaker。尝试做 p.speaker = new Speaker(); 这是最好的猜测,因为我不确定 Speaker 类的代码是什么样的。

于 2013-07-20T18:38:30.433 回答