模拟辅助方法的返回值

时间:2018-07-23 20:07:13

标签: java mocking mockito testng powermock

我正在尝试使用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;
}

2 个答案:

答案 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()

另一个优点是,文件名似乎不需要成为调用的一部分,并且可以转换为新类的属性。

另一个潜在的优势:如果您的代码变成了多线程,那么您可以让每个线程创建一个,并全部写入不同的文件。