我正在尝试使用Mockito测试这段代码
if (writeToDisk(filename, byteArray)){
return "URI1"
} else {
return "URI2"
}
由于writeToDisk旨在在UNIX服务器上运行,因此使用buffered + fileWriter会将其写入“ / tmp / upload”。 问题是我在Windows计算机上编写单元测试,而writeToDisk始终返回false,因为Java在Windows上找不到“ / tmp / upload。
有什么方法可以模拟writeak私有方法的结果?
这是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;
}
答案 0 :(得分:3)
真正的答案在这里:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("/tmp/upload"+ filename"))){
您正在这里硬编码大量内容,例如(特定于OS的)路径以及确切的编写器类型。这使得该客户端(只想在某个地方写东西)极其依赖所有这些方面。因此,变得很难测试!
您可以轻松地将所有这些方面转变为某种服务,而您只能去那里
try (Writer writer = service.getWriterFor(filename))
(或类似的东西,在这里给出一些启发)
您可以轻松地嘲笑该服务,直接使您也可以统一该代码。
这只是一个很小的抽象(可能是@FunctionalInterface,可以在生产中使用漂亮的lambda或方法引用进行初始化)。
答案 1 :(得分:0)
单元测试的优点之一是它迫使您改进设计。
是的,按照其他人的建议,您需要添加依赖项注入。
我建议您创建一个名为FileCreator
的类,并为它提供方法boolean createFile(byte[])
,并在需要时为其提供一个String getCreatedFileName()
。
另一个优点是,文件名似乎不需要成为调用的一部分,并且可以转换为新类的属性。
另一个潜在的优势:如果您的代码变成了多线程,那么您可以让每个线程创建一个,并全部写入不同的文件。