如何创建一个模仿MockFile
w.r.t的班级java.io.File
。文件读写?我在任何地方使用我自己的方法而不是new FileInputStream(....)
和new FileOutputStream(....)
,所以这部分没有问题(我总是委托给相应的流)。在更复杂的情况下,非trivila部分是MockFileInputStream
和MockFileOutputStream
的实现。
没有问题,当我第一次写入文件然后阅读它时,我可以简单地使用ByteArrayOutputStream
等等。这很简单,但是通过交错读写,它无法正常工作。比写我自己的ByteArrayOutputStream
版本更好吗?
答案 0 :(得分:4)
我会使用真实的文件和真实的FileInputStream
和FileOutputStream
。否则你只是在练习测试代码:真的很无趣。
答案 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)