在文件读取期间强制 IOException

2022-09-01 12:08:01

我有一段从文件中读取数据的代码。我想在此代码中强制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
            }
        }
    }

答案 1

免责声明:我没有在非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();

答案 2

如果可以稍微重构代码以接受 Reader 而不是文件名,则可以使用 mocks。使用EasyMock,您可以创建一个模拟阅读器,并将其设置为在调用所需的任何方法时抛出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);

推荐