我正在尝试使用Mockito 测试这段代码
if (writeToDisk(filename, byteArray)){
return "URI1"
} else {
return "URI2"
}
由于writeToDisk打算在unix服务器上运行,因此使用缓冲+fileWriter,它会写入"/tmp/upload"。问题是我在windows机器上编写单元测试,writeToDisk总是返回false,因为java在windows.上找不到"/tmp/upload">
有没有什么方法可以模拟writeToDisk,一个pacakge私有方法的结果?
这就是writeToDisk
的作用:
boolean writeToDisk(String filename, byte[] data){
boolean writeSuccessful = false;
try (BufferedWriter writer = new BufferedWriter(new FileWriter("/tmp/upload"+ filename"))){
for (byte current : data){
out.write(current);
}
writeSuccessful =true;
} catch (IOException e) {
LOG.debug(e);
}
return writeSuccessful;
}
真正的答案在这里:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("/tmp/upload"+ filename"))){
你在这里硬编码了很多东西,比如(特定于操作系统的(路径,以及确切的作者类型。这使得这个客户(只想在某个地方写东西(非常依赖于所有这些方面。因此,测试变得非常困难!
你可以很容易地将所有这些方面转化为某种服务,你只需要去那里:
try (Writer writer = service.getWriterFor(filename))
您可以很容易地模拟该服务,直接使您也可以对该代码进行单元化。
它将只是一个非常小的抽象(可能是一些@FunctionalInterface,可以在生产中使用漂亮的lambda或方法引用进行初始化(。
单元测试的优点之一是它迫使您改进设计。
因此,是的,正如其他人所建议的那样,您需要添加依赖项注入。
我建议您创建一个名为FileCreator
的类,并为其提供一个方法boolean createFile(byte[])
,如果您需要的话,可能还会提供String getCreatedFileName()
。
作为一个额外的优势,看起来文件名不需要是调用的一部分,并且可以转换为新类的属性。
另一个潜在的优势是:如果您的代码变成多线程的,那么每个线程都可以有一个创建者,所有这些都可以写入不同的文件。