30

ファイルからデータを読み取るコードがあります。テスト目的で、このコードで IOException を強制したい (この場合、コードが正しいカスタム例外をスローするかどうかを確認したい)。

たとえば、読み取りから保護されたファイルを作成する方法はありますか? いくつかのセキュリティチェックに対処することが役立つでしょうか?

FileNotFoundException には別の catch 句があるため、存在しないファイルの名前を渡すことは役に立たないことに注意してください。

質問をよりよく理解するためのコードは次のとおりです。

    BufferedReader reader = null;
    try {

        reader = new BufferedReader(new FileReader(csvFile));

        String rawLine;
        while ((rawLine = reader.readLine()) != null) {
            // some work is done here
        }

    } catch (FileNotFoundException e) {
        throw new SomeCustomException();
    } catch (IOException e) {
        throw new SomeCustomException();
    } finally {
        // close the input stream
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
4

12 に答える 12

14

免責事項:これはWindows以外のプラットフォームではテストしていないため、ファイルロック特性が異なるプラットフォームでは異なる結果になる可能性があります。

事前にファイルをロックしておくと、何かがファイルから読み取ろうとしたときにIOExceptionをトリガーできます。

java.io.IOException: The process cannot access the file because another process has locked a portion of the file

これは、同じスレッドにいる場合でも機能します。

サンプルコードは次のとおりです。

final RandomAccessFile raFile = new RandomAccessFile(csvFile, "rw");
raFile.getChannel().lock();
于 2011-07-25T12:00:03.660 に答える
4

ファイル名ではなくリーダーを受け入れるようにコードを少しリファクタリングできる場合は、モックを使用できます。EasyMockを使用すると、モック Reader を作成し、必要なメソッドを呼び出したときに IOException をスローするように設定できます。次に、テストするメソッドにそれを渡し、何が起こるかを観察します:-)

void readFile(Reader reader) throws SomeCustomException {
    try {
        String rawLine;
        while ((rawLine = reader.readLine()) != null) {
            // some work is done here
        }

    } catch (FileNotFoundException e) {
        throw new SomeCustomException();
    } catch (IOException e) {
        throw new SomeCustomException();
    } finally {
        // close the input stream
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
}

次にテストコード:

mockReader = createMock(Reader.class);
expect(mockReader.readLine()).andThrow(
        new IOException("Something terrible happened"));
replay(mockReader);

objectToTest.readFile(reader);
于 2010-04-02T13:07:38.813 に答える
3

テストで、例外をスローするオーバーロードされた fileInputStream を定義します

FileInputStream s;
try {
    s = new FileInputStream(fileName) {

           @Override
           public int read() throws IOException {
              throw new IOException("Expected as a test");
           }
       };
} catch (FileNotFoundException e) {
   throw new RuntimeException(e.getMessage(), e);
}
于 2016-08-24T13:36:10.093 に答える
2

で close メソッドを呼び出すことで、強制的に例外を発生させることができますBufferedReader:

    reader = new BufferedReader(new FileReader(csvFile));

    // invoke the Close() method.
    reader.Close();

    String rawLine;
    while ((rawLine = reader.readLine()) != null) {
        // some work is done here
    }

それが役立つことを願っています。

于 2012-10-12T17:40:53.247 に答える
2

スーパーユーザーとしてファイルを作成してから、標準ユーザーとして読み取ることができます。そこには権限の問題があるはずです。または、Linuxを使用していると仮定して、単にchmodします。非表示/保護されたディレクトリに配置することもできます。

于 2010-04-02T13:06:37.100 に答える
1

MockitoEasymock (+classpath)などのモック ライブラリを使用してモック ファイル オブジェクトを作成することもできます (新しいライブラリには、File などの具象クラスをモックできるクラスローダー拡張機能があります)。または、PowerMock (ブログを参照)などと連携して、コンストラクター呼び出し用に生成されたモックを呼び出し、呼び出されたときに適切な例外をスローします。

于 2010-04-02T21:24:47.230 に答える
0

大きすぎるファイルに対してこの例外を発生させることができます。

于 2010-04-02T13:06:12.663 に答える
0

FileNotFoundException を使用しないことをお勧めします。存在しないファイルに対して特定の例外をスローする場合は、csvFile.exists() をチェックします。

たとえば、csvFileをディレクトリにすることができます。あなたのコードをテストしたところ、次のようにスローされました。

File file = new File("actually_a_directory.csv"); file.mkdir(); yourCode(file); // throws FileNotFoundException: "actually_a_directory.csv (Access is denied)"

私の意見では、実際にディレクトリであるファイルは FileNotFound と同じではありませんが、Java では同じように機能します。

于 2016-08-18T22:19:24.753 に答える
-2

あなたはいつでもあなた自身のものを投げることができますIOException

throw new IOException("Test IOException");
于 2010-04-02T13:05:23.210 に答える