私は、与えられた選択に基づいて異なる操作を呼び出すメニューを持っています。私は適切なメソッドが呼び出されているかどうかを確認するために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.
?これを修正するにはどうすればいいですか?
あなたは 'PrintBooksOperation'を嘲笑していますが、あなたはまったく使っていません。そして最後に、 'execute'メソッドが呼ばれたことを' verify'するので、これは動作しません(呼び出されなかったので)。あなたは実際何をしてテストしようとしていますか?また、コードを[mcve]に減らしてください。関連性のないコードがあまりにも多すぎます。 – Tunaki
それは、あなたが 'print'を使って**何も**していないことはかなり明らかです。したがって、メソッドが呼び出されることはありません。 –
@Oliverコードが実行され、正しく印刷されます。ちょうどmockitoでそれをチェックしたい。 – leoOrion