首页 > 解决方案 > 如何使用 Mockito 测试一个简单的给定方法

问题描述

我是使用 java 测试的新手,所以它让我有点困惑如何为没有参数和返回值的方法编写适当的单元测试。一般来说,代码片段如下所示:


public class SplitterService {

private SentenceDAO sentenceObject;
private ObjectToXML objectToXML;
private ObjectToCSV objectToCSV;

public SplitterService(int selector, String inputPath, String outputPath) {
        this(inputPath);
        if (selector == 1)
            objectToCSV = new ObjectToCSV(outputPath, size);
        if (selector == 2)
            objectToXML = new ObjectToXML(outputPath);
    }

public void chooseConverter() {
        if (objectToCSV != null)
            objectToCSV.printRecord(sentenceObject);
        if (objectToXML != null)
            objectToXML.marshal(sentenceObject);
    }
}

类中有 3 个私有字段。还有一个构造函数可以实例化给定的类。然后在 chooseConverter() 方法中根据创建的对象采取适当的行动。

您能否给我一些建议如何测试 chooseConverter 方法,因为没有返回值和参数(我知道 Junit 5 和一点 Mockito)。我不是在寻找任何给定的解决方案,只是几句话如何解决我的问题。

标签: javatestingmockitojunit5

解决方案


当前形式的代码对单元测试不友好。作为最后的手段,您可以测试 ObjectToCSV 和 ObjectToXML 的副作用,但让我们尝试做得更好。

理想情况下,该类应提供一些注入点以允许您注入新的 ObjectToCSV 和 ObjectToXML 模拟实例。

  • 有多种方法可以引入 DI,例如在构造函数中为这些对象提供工厂,提取 SplitterService 工厂,根据选择器注入 objectToCSV 或 objectToXML。这些方法需要对客户端代码进行一些修改。

  • 从构造函数中提取创建 objectToCSV 和 objectToXML 实例的方法需要最少的代码更改,并且对客户端是透明的。在这种情况下,您将类子类化并覆盖构建器方法以返回模拟。

  • 如果不允许对现有代码进行修改,我建议您引入 Powermock 并模拟构造函数。注意:您必须运行 junit4 老式引擎,因为 Powermock 尚未移植到 jUnit5。 https://dzone.com/articles/using-powermock-mock


推荐阅读