2016-08-14 13 views
-2

私は、与えられた選択に基づいて異なる操作を呼び出すメニューを持っています。私は適切なメソッドが呼び出されているかどうかを確認するためにmockitoを使いたい。 は、これは私のimplenetationで、これまでに...メソッドがMockitoを使用して呼び出されているかどうかのテスト

Menu.java:

私のメニューはオプションと異なるオプションのインスタンスになります。

例えば、 printItemOfTypeBookはPrintBookOperationのインスタンスです。

private void setMenuOptions() { 
     char keyForPrintingBooks = '1'; 
     char keyForPrintingMovies = '2'; 
     char keyForAccountLogin = '3'; 
     char keyForExit = '4'; 
     menuOptions.put(keyForPrintingBooks, printItemsOfTypeBook); 
     menuOptions.put(keyForPrintingMovies, printItemsOfTypeMovie); 
     homeMenuOptions.put(keyForAccountLogin, loginAccount); 
     homeMenuOptions.put(keyForExit, quit); 
    } 

次に、適用選択メソッドに文字を渡します。このメソッドは、適切なインスタンスを見つけて呼び出しを実行します。

public void applyChoice(char choice) { 
     if ((!menuOptions.containsKey(choice)) && (!homeMenuOptions.containsKey(choice))) { 
      new WrongChoiceOperation(); 
     } 
     if (menuOptions.containsKey(choice)) { 
      menuOptions.get(choice).execute(library, reader, writer); 
     } 
     if (homeMenuOptions.containsKey(choice)) { 
      homeMenuOptions.get(choice).execute(library, reader, writer); 
     } 
    } 
} 

私は本を印刷する最初のオプションをテストしています。だから、私はPrintBookOperationクラスを模擬し、その中のexecuteメソッドが呼び出されているかどうかを調べます。

PrintBookOperation.java:

@Override 
    public void execute(Library library, Input reader, Output writer) { 
     this.library = library; 
     this.writer = writer; 
     printBooks(); 
    } 

    private void printBooks() { 
     writer.formattedHeadings(); 
     List<Lendable> items = library.listItems(); 
     items.stream().filter(item -> item.isOfType(Book)).forEach(item -> { 
      writer.write("\n" + item.toFormattedString()); 
     }); 
    } 
} 

私のテスト:

@Test 
    public void isThePrintOperationCalled() { 
     Input reader = new ConsoleInput(); 
     Output writer = new ConsoleOutput(); 
     PrintBooksOperation print = mock(PrintBooksOperation.class); 
     Book book = new Book("nin", "#123", "ghy", 2003); 
     Library library = new Library(new LinkedList<>(singletonList(book))); 
     Menu menu = new Menu(reader, writer, library); 
     menu.applyChoice('1'); 
     verify(print).execute(library, reader, writer); 
    } 

} 

マイエラーメッセージ:私が間違っているのは何

Wanted but not invoked: 
printBooksOperation.execute(
    [email protected], 
    Mock for Input, hashCode: 1471868639, 
    Mock for Output, hashCode: 876563773 
); 
-> at tw51.biblioteca.io.menu.home.MenuTest.isThePrintOperationCalled(MenuTest.java:30) 
Actually, there were zero interactions with this mock. 

?これを修正するにはどうすればいいですか?

+1

あなたは 'PrintBooksOperation'を嘲笑していますが、あなたはまったく使っていません。そして最後に、 'execute'メソッドが呼ばれたことを' verify'するので、これは動作しません(呼び出されなかったので)。あなたは実際何をしてテストしようとしていますか?また、コードを[mcve]に減らしてください。関連性のないコードがあまりにも多すぎます。 – Tunaki

+0

それは、あなたが 'print'を使って**何も**していないことはかなり明らかです。したがって、メソッドが呼び出されることはありません。 –

+0

@Oliverコードが実行され、正しく印刷されます。ちょうどmockitoでそれをチェックしたい。 – leoOrion

答えて

2

PrintBooksOperationクラス(printと呼ばれます)用のモックを作成していますが、モックはテスト対象のクラスに送られません。そのため、関数を実行したため、mockitoは例外をスローしません。

あなたは

  • を注入するように私はあなたのMenuクラスを変更することをお勧めprintItemsOfTypeBook
  • printItemsOfTypeMovie
  • loginAccount
  • はむしろMenu.java内の新しいインスタンスを割り当てるよりも、

を終了します。

public class Menu { 
    public Menu(Input reader, 
       Output writer, 
       Library library, 
       PrintBooksOperation printItemsOfTypeBook, 
       PrintMoviesOperation printItemsOfTypeMovie, 
       LoginAccountOperation loginAccount, 
       QuitOperation quit) { 
      this.reader = reader; 
      this.writer = writer; 
      this.library = library; 
      this.printItemsOfTypeBook = printItemsOfTypeBook; 
      this.printItemsOfTypeMovie = printItemsOfTypeMovie; 
      this.loginAccount = loginAccount; 
      this.quit = quit; 
    } 
} 

(上記の他の操作クラスのクラス名を推測しています)。テストクラスでは、次の操作を行うことができます:

PrintBooksOperation print = mock(PrintBooksOperation.class); 
    Menu menu = new Menu(reader, writer, library, print, null, null, null); 
    menu.applyChoice('1'); 
    verify(print).execute(library, reader, writer); 

検証が正しく機能するようになりました。

あなたのユニットに依存性注入を使用すると、基本的にユニットテストが非常に簡単になります。

関連する問題