如何在Java中模拟文件IO?

时间:2011-07-27 06:35:43

标签: java file io

如何创建一个模仿MockFile w.r.t的班级java.io.File。文件读写?我在任何地方使用我自己的方法而不是new FileInputStream(....)new FileOutputStream(....),所以这部分没有问题(我总是委托给相应的流)。在更复杂的情况下,非trivila部分是MockFileInputStreamMockFileOutputStream的实现。

没有问题,当我第一次写入文件然后阅读它时,我可以简单地使用ByteArrayOutputStream等等。这很简单,但是通过交错读写,它无法正常工作。比写我自己的ByteArrayOutputStream版本更好吗?

2 个答案:

答案 0 :(得分:4)

我会使用真实的文件和真实的FileInputStreamFileOutputStream。否则你只是在练习测试代码:真的很无趣。

答案 1 :(得分:3)

我创建了一个'WordCounter'类来计算文件中的单词。但是,我想对我的代码进行单元测试,单元测试不应该触及文件系统。

因此,通过将实际的文件IO(FileReader)重构为它自己的方法(让我们面对它,标准的Java File IO类可能工作,所以我们通过测试它们没有获得多少)我们可以测试我们的字数统计逻辑孤立地。

import static org.junit.Assert.assertEquals;

import java.io.*;

import org.junit.Before;
import org.junit.Test;

public class WordCounterTest {

    public static class WordCounter {

        public int getWordCount(final File file) throws FileNotFoundException {
            return getWordCount(new BufferedReader(new FileReader(file)));
        }

        public int getWordCount(final BufferedReader reader) {
            int wordCount = 0;
            try {
                String line;
                while ((line = reader.readLine()) != null) {
                    wordCount += line.trim().split(" ").length;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (reader != null) {
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return wordCount;
        }
    }

    private static String TEST_CONTENT = "Neque porro quisquam est qui dolorem\n"
            + " ipsum quia dolor sit amet, consectetur, adipisci velit...";

    private WordCounter wordCounter;

    @Before
    public void setUp() {
        wordCounter = new WordCounter();
    }

    @Test
    public void ensureExpectedWordCountIsReturned() {
        assertEquals(14, wordCounter.getWordCount(new BufferedReader(new StringReader(TEST_CONTENT))));
    }
}

编辑:我应该注意,如果您的测试与您的代码共享相同的包,则可以降低

的可见性
public int getWordCount(final BufferedReader reader)

方法,因此您的公开API仅公开

public int getWordCount(final File file)