如何使用Mockito测试简单的给定方法

时间:2019-05-13 18:22:16

标签: java testing mockito junit5

我是使用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个私人领域。还有一个实例化给定类的构造函数。然后在choiceConverter()方法中,根据创建的对象采取适当的措施。

由于没有返回值和参数(我知道Junit 5和Mockito很少),您能否给我一些建议,以测试如何测试choiceConverter方法。我不是在寻找任何给定的解决方案,而是说了几句如何解决我的问题。

2 个答案:

答案 0 :(得分:1)

当前形式的代码不适合单元测试。 作为最后的选择,您可以测试ObjectToCSV和ObjectToXML的副作用,但请尝试做得更好。

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

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

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

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

答案 1 :(得分:0)

您正在这里看几件事...首先检查在objectToCSV::printRecord(和{{1)的情况下调用了objectToCSVobjectToCSV != null将是Mockito模拟) }}在objectToXML:: marshal下被调用。另外,您最有可能在寻找objectToXML != null,这是为了测试ArgumentCaptorobjectToCSV::printRecord实际上是通过您设置的objectToXML.marshal被调用的。