我知道这有点幼稚。如何在不提供物理文件作为输入的情况下对这段代码进行单元测试。我是模拟和单元测试的新手。所以我不确定。请帮忙。
public static String fileToString(File file) throws IOException
{
BufferedReader br = new BufferedReader(new FileReader(file));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append("n");
line = br.readLine();
}
return sb.toString();
} finally {
br.close();
}
}
您可以创建一个文件作为测试的一部分,无需模拟它。
JUnit 确实有一个很好的功能,用于创建用于测试的文件并使用 TemporaryFolder
规则自动清理它们。
public class MyTestClass {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void myTest() {
// this folder gets cleaned up automatically by JUnit
File file = folder.newFile("someTestFile.txt");
// populate the file
// run your test
}
}
您可能应该重构您的方法。正如您意识到的,将文件作为输入的方法不容易测试。此外,它似乎是静态的,这无助于可测试性。如果将方法重写为:
public String fileToString(BufferedReader input) throws IOException
测试起来会容易得多。您将业务逻辑与读取文件的技术细节分开。据我了解,您的业务逻辑是读取流并确保行尾是 unix 样式。
如果这样做,您的方法将是可测试的。您还可以使其更通用:它现在可以从文件、URL 或任何类型的流中读取。更好的代码,更容易测试...
为什么要模拟文件?嘲笑java.io.File
是一个坏主意,因为它有很多原生的东西。我建议您确保在运行单元测试时,类路径中有一个极简的文本文件可用。您可以将此文件转换为文本并确认输出。
结合使用ByteArrayInputStream和BufferedReader类,在你的代码中制作你需要的文件。因此,无需在系统上创建真正的文件。如果您没有足够的权限(基于某些特定情况)来创建文件,会发生什么情况。在下面的代码中,您可以创建自己所需的文件内容:
public static void main(String a[]){
String str = "converting to input stream"+
"n and this is second line";
byte[] content = str.getBytes();
InputStream is = null;
BufferedReader bfReader = null;
try {
is = new ByteArrayInputStream(content);
bfReader = new BufferedReader(new InputStreamReader(is));
String temp = null;
while((temp = bfReader.readLine()) != null){
System.out.println(temp);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try{
if(is != null) is.close();
} catch (Exception ex){
}
}
}