出力をコンソールに出力するメソッドを作成しました。どのようにテストすればよいですか?
public class PrinterForConsole implements Printer<Item>{
public void printResult(List<Item> items) {
for (Item item: items){
System.out.println("Name: " + item.getName());
System.out.println("Number: " + item.getNumber());
}
}
}
現在、私のテストは次のようになっています
public class TestPrinter{
@Test
public void printResultTest() throws Exception {
(am figuring out what to put here)
}
}
私はこれで解決策を読みました post (これを強調してくれた@Codebenderと@KDMに感謝します)が、それを完全には理解していません。そこでのソリューションは、print(List items)メソッドをどのようにテストしますか?したがって、ここで新たに質問します。
重複した質問の内容がわからないとおっしゃっていたので、少し説明させていただきます。
これを行うと、System.setOut(OutputStream)
は、アプリケーションがコンソールに書き込むものは何でも(System.out.printX()
を使用)、代わりに、渡したoutputStream
に書き込まれます。
だから、あなたは次のようなことをすることができます、
public void printTest() throws Exception {
ByteArrayOutputStream outContent = new ByteArrayOutputStream();
System.setOut(new PrintStream(outContent));
// After this all System.out.println() statements will come to outContent stream.
// So, you can normally call,
print(items); // I will assume items is already initialized properly.
//Now you have to validate the output. Let's say items had 1 element.
// With name as FirstElement and number as 1.
String expectedOutput = "Name: FirstElement\nNumber: 1" // Notice the \n for new line.
// Do the actual assertion.
assertEquals(expectedOutput, outContent.toString());
}
それをテストする最良の方法は、パラメーターとしてPrintStream
を受け入れるようにリファクタリングすることです。また、PrintStream
から構築された別のByteArrayOutputStream
を渡して、baosに何が出力されるかを確認できます。 。
それ以外の場合は、System.setOut
を使用して標準出力を別のストリームに設定できます。メソッドが戻った後、何が書き込まれているかを確認できます。
コメント付きの簡略版は以下のとおりです。
@Test
public void printTest() throws Exception {
// Create our test list of items
ArrayList<Item> items = new ArrayList<Item>();
items.add(new Item("KDM", 1810));
items.add(new Item("Roy", 2010));
// Keep current System.out with us
PrintStream oldOut = System.out;
// Create a ByteArrayOutputStream so that we can get the output
// from the call to print
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Change System.out to point out to our stream
System.setOut(new PrintStream(baos));
print(items);
// Reset the System.out
System.setOut(oldOut);
// Our baos has the content from the print statement
String output = new String(baos.toByteArray());
// Add some assertions out output
assertTrue(output.contains("Name: KDM"));
assertTrue(output.contains("Name: Roy"));
System.out.println(output);
}
print
メソッドが例外をスローした場合、System.out
はリセットされないことに注意してください。これを設定およびリセットするには、setup
およびteardown
メソッドを使用することをお勧めします。
このようなものはどうですか。
@Test
public void printTest() throws Exception {
OutputStream os = new ByteArrayOutputStream();
System.setOut(os);
objectInTest.print(items);
String actualOutput = os.toString("UTF-8");
assertEquals(expectedOutput, actualOutput);
}
これは単純なテストコードです:-
@Test
public void out() {
System.out.print("hello");
assertEquals("helloworld", outContent.toString());
}
@Test
public void err() {
System.err.print("helloworld 1 ");
assertEquals("helloworld 1", errContent.toString());
}
最終的に、私が思いついたのはこれです(上記のすべての回答と可能な重複へのリンクを調べた後)。
import org.junit.Test;
@Test
public void shouldPrintToConsole() throws Exception {
Item testItem = new Item("Name", "Number");
List<Item> items = Arrays.asList(testItem);
Printer print = new Printer();
printer.printOutput(items);
}
テスト用の命名規則(shouldPrintToConsole())も読んでください。フォローしているサイトとフォローしていないサイトがたくさんあるので、これがコンベンションなのか疑問に思います。