web-dev-qa-db-ja.com

JUnitを使用してJava)で印刷メソッドをテストする方法

出力をコンソールに出力するメソッドを作成しました。どのようにテストすればよいですか?

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)メソッドをどのようにテストしますか?したがって、ここで新たに質問します。

6
Roy

重複した質問の内容がわからないとおっしゃっていたので、少し説明させていただきます。

これを行うと、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());
}
14
Codebender

それをテストする最良の方法は、パラメーターとして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);
    }
1
Jose Martinez

これは単純なテストコードです:-

@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());
}

詳細: System.out.println()のJUnitテスト

0
Anand Dwivedi

最終的に、私が思いついたのはこれです(上記のすべての回答と可能な重複へのリンクを調べた後)。

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())も読んでください。フォローしているサイトとフォローしていないサイトがたくさんあるので、これがコンベンションなのか疑問に思います。

0
Roy