昨日の続きです
System.out.printlnで出力された文字列のAssertEquals
テストクラス
package jp.boctok.sample8.systemout; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class SystemOutTest { /* System.outの代用のためのByteArrayStream */ private final ByteArrayOutputStream outStream = new ByteArrayOutputStream(); /* 元のSystem.out */ private final PrintStream orgOutStream = System.out; /* System.errの代用のためのByteArrayStream */ private final ByteArrayOutputStream errStream = new ByteArrayOutputStream(); /* 元のSystem.err */ private final PrintStream orgErrStream = System.err; @BeforeMethod public void beforeTest() { // System.outに代用のByteArrayStreamを出力させるように設定 System.setOut(new PrintStream(outStream)); // System.errに代用のByteArrayStreamを出力させるように設定 System.setErr(new PrintStream(errStream)); } @AfterMethod public void afterTest() { // System.outを元に戻す。 System.setOut(new PrintStream(orgOutStream)); // System.errを元に戻す。 System.setErr(new PrintStream(orgErrStream)); } @Test public void systemPrint() { // System.out.printのテスト String text = "print out"; System.out.print(text); assertThat(outStream.toString(), is(text)); // System.err.printのテスト text = "print err"; System.err.print(text); assertThat(errStream.toString(), is(text)); } }
printlnでなくprintにするのは、改行文字が入ってしまうからです。 printlnで評価する時は後ろに改行文字を付け足します。
実行すると
[TestNG] Running: /tmp/testng-eclipse--1818333339/testng-customsuite.xml PASSED: systemPrint =============================================== Default test Tests run: 1, Failures: 0, Skips: 0 =============================================== =============================================== Default suite Total tests run: 1, Failures: 0, Skips: 0 =============================================== [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@3701eaf6: 3 ms [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@35d176f7: 5 ms [TestNG] Time taken by org.testng.reporters.XMLReporter@3d99d22e: 4 ms [TestNG] Time taken by org.testng.reporters.EmailableReporter2@63e2203c: 2 ms [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms [TestNG] Time taken by org.testng.reporters.jq.Main@59e5ddf: 16 ms
System.outに設定されているPrintStreamオブジェクトを取得可能な物にすることで値を参照することができました。 この場合、元に戻すのを忘れるとその後にSystem.outやSystem.errの挙動がおかしくなるので注意しましょう。