0

期待どおりに動作しないテスト メソッドがいくつかあります。これらのシナリオでは、ログ メッセージをテキスト ファイルに書き込んでいます。

どちらの方法も、ファイルへの出力リンクを閉じて、それに書き込もうとしています。明らかにこれはIOException、私のコードにも反映されていることを期待していることを意味します。

これらは、私が話している2つのテスト方法です

@Test(expected = IOException.class)
public void writeToClosedConnection() throws IOException {
    LogHandler.getInstance().createNewChatlog("Jack");
    LogHandler.getInstance().stopLogging(); // Closes the bufferedWriter
    LogHandler.getInstance().writeToChatLog(new Message("Jim", "CAN'T WORK"));
}

@Test(expected = IOException.class)
public void closeStream() throws IOException {
    log = new ChatLog(new GregorianCalendar(), "STANDARDTESTLOG", directory);
    log.closeLogFile(); // Closes the bufferedWriter
    log.addMessage(new Message("Jim", "CAN'T WORK"));
}

メッセージを書き込む両方の方法は、同じルートに属します。writeToChatLoginvokes はaddMessagewriteToLogFileメソッドを呼び出します。

この最後のメソッドは次のように定義されます

protected void writeToLogFile(String message) {
    try {
        if (logging) {
            bWriter.write(message);
            bWriter.newLine();
            bWriter.flush();
        } else {
            throw new ForbiddenActionException("Logging is disabled");
        }
    } catch (IOException e) {
        OutputUtil.showErrorMessage("Couldn't write to logfile", "IO error");
        e.printStackTrace();
    }
}

当面の問題は、IOエラーがスローされても(これの2倍:)

java.io.IOException: Stream closed
    at java.io.BufferedWriter.ensureOpen(Unknown Source)
    at java.io.BufferedWriter.write(Unknown Source)
    at java.io.Writer.write(Unknown Source)
    at io.Log.writeToLogFile(Log.java:41)
    at io.ChatLog.addMessage(ChatLog.java:16)
    at tests.ChatLogTest.closeStream(ChatLogTest.java:76)

ポップアップ メッセージ ( Couldn't write to logfile) が表示されますが、まだ assertionError ( java.lang.AssertionError: Expected exception: java.io.IOException) が発生します。

JUnit はバージョン 4 です。

なぜこうなった?

4

2 に答える 2

4

writeToLogFile()IOExceptionをスローしません。もしそうなら、それは次のように宣言する必要があります

protected void writeToLogFile(String message) throws IOException {

の命令からスローされる可能性のあるIOExceptionを明示的にキャッチwriteToLogFile()しています。例外のキャッチは、例外がスローされないようにするために正確に使用されます。

IOExceptionをキャッチせず、メソッド宣言でIOExceptionを宣言すると、テストに合格します。

protected void writeToLogFile(String message) throws IOException {
    if (logging) {
        bWriter.write(message);
        bWriter.newLine();
        bWriter.flush();
    } else {
        throw new ForbiddenActionException("Logging is disabled");
    }
}
于 2013-02-02T18:17:30.213 に答える
4

あなたは本当に投げることはありませんIOException。内部writeToLogFileでそれをキャッチし、ログに記録し、他に何もしません。あなたの外の世界の観点からは、何も悪いことは起こりませんでした:

protected void writeToLogFile(String message) {
    try {
        //...
    } catch (IOException e) {
        //...
        e.printStackTrace();
    }
}

ほら、投げられてもIOException抑制されます。したがって、メソッドからエスケープwriteToClosedConnection()することはないため、JUnitはそれを認識できません。そして、それはテストに失敗します。迅速な解決策は、例外を伝播することです。これには、残念ながら、署名を変更する必要があります。

protected void writeToLogFile(String message) throws IOException {
    try {
        //...
    } catch (IOException e) {
        //...
        throw e;
    }
}
于 2013-02-02T18:17:40.333 に答える