0

setTrailer()ErParser クラス内のメソッドのテスト ケースを作成しようとしています。setTrailer()には try-catch 句があり、その catch 句の 1 つで catches しNullPointerExceptionます。setTrailer()をスローしてキャッチする場合の Junit テストを作成しようとしていますNullPointerExceptionが、テスト ケースは失敗し続けます。メソッド自体で既に例外をキャッチしたためですか?代わりに、テスト ケースで例外をキャッチする必要がありますか?

テストケース:

public class TestERParser { 
    @Test(expected=NullPointerException.class)
    public void nullSetTrailer() {
        ERParser recCurrParse = new ERParser();
        recCurrParse.setTrailer(null);
    }   
}

ERParser クラス内の setTrailer() メソッド:

public class ERParser {
private static final String TRAILER_E = "GRAND TOTAL";
private static final String TRAILER_R = "TRAILER";
public String trailerRecord; 

/**
 * Constructs an ERParser object.
 */
public ERParser() {
    this.trailerRecord = null;
    this.trailerVals = null;
}
/**
 * Populates the trailerRecord field with the summary (trailer) record of the input file.
 * @param file  Input file
 * @throws NullPointerException, FileNotFoundException, IOException
 */
public void setTrailer(File file) {
    try {
        FileReader fReader = new FileReader(file);
        BufferedReader bReader = new BufferedReader (fReader);
        String currLine = new String();
        readLoop:
            while (bReader.ready()) {
                currLine = bReader.readLine();
                if (currLine.contains(TRAILER_E) || currLine.contains(TRAILER_R)) {
                    break readLoop;
                }
            }
        this.trailerRecord = currLine.trim();
        System.out.println("From setTrailer(): " + this.trailerRecord);
        fReader.close();
        bReader.close();
    } catch (NullPointerException exception) {
        exception.printStackTrace();
    } catch (FileNotFoundException exception) {
        exception.printStackTrace();
    } catch (IOException exception) {
        exception.printStackTrace();
    }
}
}
4

3 に答える 3

1

この catch ブロックが例外が処理されることを意味するかどうかについて議論することができます。スタック トレースを出力するだけでは何も処理されないと私は主張します。メソッド シグネチャに throws 句を追加して、例外の処理方法をクライアントに決定させる方がよい場合があります。

メソッドがそのように書かれている場合、書かれたとおりにテストするのはあなた次第です。これがサードパーティのライブラリである場合、選択の余地はありません。

例外をスローするテストを作成します。成功trailerRecordは に設定されていることを意味しnullます。

コードには別の欠陥があります。finally ブロックでストリームを閉じます。入力ストリームを適切に閉じないリスクがあります。

于 2013-09-24T23:18:11.670 に答える
1

ご想像のとおり、コード内で NPE をキャッチしていて、それが伝播されていません。ユーザーがこの例外をキャッチすることが予想される場合は、このコードを削除し、適切なクラスに対してメソッドをスローで装飾する必要があります。

public void setTrailer(File file) throws Exception {
        FileReader fReader = new FileReader(file);
        BufferedReader bReader = new BufferedReader (fReader);
        String currLine = new String();
        readLoop:
            while (bReader.ready()) {
                currLine = bReader.readLine();
                if (currLine.contains(TRAILER_E) || currLine.contains(TRAILER_R)) {
                    break readLoop;
                }
            }
        this.trailerRecord = currLine.trim();
        System.out.println("From setTrailer(): " + this.trailerRecord);
        fReader.close();
        bReader.close();
}

コードがチェック済み例外をスローするようになったため、Junit メソッドを少し更新して、チェック済み例外をキャッチする必要があります。

   @Test(expected=NullPointerException.class)
    public void nullSetTrailer() throws Exception {
        ERParser recCurrParse = new ERParser();
        recCurrParse.setTrailer(null);
    }   
于 2013-09-24T23:19:29.720 に答える
0

あなたのテストケースでは、 NullPointerException クラスが期待されています。キャッチすると、呼び出し元クラスはそれを取得しません。したがって、try/catch ブロックを削除するか、stacktrace を出力した後に例外を再スローすることができます。

catch (NullPointerException exception) {
        exception.printStackTrace();
        throw new NullPointerException();
    }
于 2013-09-24T23:22:27.197 に答える