1

System.out (およびおそらく System.err) に書き込まれた出力をテストする単体テストを作成するアプリケーションがあります。個々のテストはそれぞれ期待どおりに機能しますが、同じクラスに複数のテストを追加すると、JUnit4 がマルチスレッドのように見えるため、いくつかのテストが失敗します (したがって、ストリームが正確にリセットされるタイミングについての保証はありません)。すべてのテスト メソッドを独自のクラスに分離し、テスト スイートを使用する場合も同じことが起こります。

何か案は?

private static final PrintStream SYS_OUT = System.out;
private static final PrintStream SYS_ERR = System.err;

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();

@Before
public final void setUpStreams() throws UnsupportedEncodingException {
    System.setOut(new PrintStream(this.outContent, true, CHARSET));
    System.setErr(new PrintStream(this.errContent, true, CHARSET));
}

@After
public final void cleanUpStreams() {
    System.setOut(SYS_OUT);
    System.setErr(SYS_ERR);
}

@Test
public final void listServicesAndMethods() throws ServiceException, UnsupportedEncodingException {
    com.example.Main.main(new String[]{"--list-services"});
    LOG.debug(this.outContent.toString(CHARSET));
    assertTrue("String not found", this.outContent.toString(CHARSET).contains("Some string"));
    assertFalse("Other string found", this.outContent.toString(CHARSET).contains("Some other string"));
    this.outContent.reset();
    this.errContent.reset();
}

編集:失敗したテストの問題は、ストリームが原因ではなく(単に?)、メインクラスの静的フィールドにオプションを保存したことが原因であることが判明しました。これには、連続したテスト中にいくつかのオプションがアクティブなままになるという効果があります。Arian の提案を実装した後、静的メソッドを呼び出す代わりに 2 番目のクラスをインスタンスとして使用して、問題を解決したことに気付きました。

返信してくれたすべての人に感謝します。

4

1 に答える 1

0

に直接書き込むのではなく、出力をパラメータとして受け取るようにアプリケーションの一部を書き直します (まだ行っていない場合) System.out。これは通常、テストに関係なく、より優れた設計です。

各テストで、新しい出力ストリームを作成 (または、必要に応じてスパイSystem.out) し、それをテスト対象のコード ユニットに渡します。

于 2013-01-04T10:33:52.053 に答える