2016-08-14 12 views
0

printBooks操作クラスを使用してライブラリから書籍のリストを印刷しています。適切な出力がコンソールに書き込まれているかどうかを確認したい。 これはこれまで私が試したことです。誰かがここで間違っていることを説明してください。前もって感謝します。mockitoを使用したモックコンソール

PrintBooksOperation.java

package tw51.biblioteca.io.menu; 

import tw51.biblioteca.Lendable; 
import tw51.biblioteca.Library; 
import tw51.biblioteca.io.Input; 
import tw51.biblioteca.io.Output; 
import tw51.biblioteca.io.menu.home.MenuOptions; 

import java.util.List; 

import static tw51.biblioteca.ItemType.Book; 

/** 
* Prints the Items Of Type Book. 
*/ 

public class PrintBooksOperation implements MenuOptions { 

    private Library library; 
    private Output writer; 

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

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

PrintBooksOperationTest.java

package tw51.biblioteca.io.menu; 

import org.junit.Test; 
import tw51.biblioteca.Book; 
import tw51.biblioteca.Library; 
import tw51.biblioteca.io.Input; 
import tw51.biblioteca.io.Output; 

import java.util.Arrays; 
import java.util.LinkedList; 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

/** 
* 
*/ 
public class PrintBooksOperationTest { 

    @Test 
    public void areTheBooksPrintedCorrectly() { 
     Input reader = mock(Input.class); 
     Output writer = mock(Output.class); 
     Book book = new Book("nin", "#123", "ghy", 2003); 
     Library library = new Library(new LinkedList<>(Arrays.asList(book))); 
     PrintBooksOperation print = new PrintBooksOperation(); 
     print.execute(library, reader, writer); 
     verify(writer).write(""); 
    } 
} 

入力と出力は、コンソールの読み取りや書き込みを実装するインターフェイスです。

マイエラーメッセージ:

Argument(s) are different! Wanted: 
output.write(
    "" 
); 
-> at tw51.biblioteca.io.menu.PrintBooksOperationTest.areTheBooksPrintedCorrectly(PrintBooksOperationTest.java:28) 
Actual invocation has different arguments: 
output.write(
    " 
" 
); 

なぜ実引数が空になっていますか? Printoperationは、実行すると動作します。私が間違っていることがありますか?または、コンソールをテストする別の方法はありますか?

答えて

1

ライターインスタンスでverifyを呼び出すと、最初に引数 ""を指定して呼び出す必要があることを通知しています。あなたの実装から

しかし、あなたはそれへの書き込み数回

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

引数を書く呼び出し初めて改行している実際"\n"で、これが一致し、空の文字列とテストが失敗しないことに注意してください。テストを変更して "\ n"を確認するか、メソッドを変更して期待どおりに印刷します。

1

"期待値"の値が空の文字列("")の間、実際の関数呼び出しが余分な空白(別の行にあることに注意してください)を返しています。

この空白を必要な部分に追加するか、機能を変更する必要があります。

+0

なぜ空白が返されますか?それは実際の議論の本の詳細を印刷する必要があります。 – leoOrion

+0

わかりません。私はあなたの 'toFormattedString'と関係があると思います。 – fdsa

関連する問題