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を受け取ります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);
    }
  }
}
于 2013-07-20T21:06:14.410 に答える
0

dao に「when」のみを使用したため、Speaker のオブジェクトをモックする必要はないと思います。Speaker に、speak メソッドが失敗する原因となるモック化が必要なオブジェクトがない限り、Speaker をモックする必要はありません。p.speaker = new Speaker(); を実行してみてください。Speaker クラスのコードがどのようなものかよくわからないので、これが最善の推測です。

于 2013-07-20T18:38:30.433 に答える