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

Java 如何使用Mockito测试简单的给定方法,java,testing,mockito,junit5,Java,Testing,Mockito,Junit5,我是java测试新手,所以如何为一个没有参数和返回值的方法编写适当的单元测试让我有点困惑。一般情况下,代码段如下所示: public class SplitterService { private SentenceDAO sentenceObject; private ObjectToXML objectToXML; private ObjectToCSV objectToCSV; public SplitterService(int selector, String inputPath,

我是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方法吗?因为没有返回值和参数(我知道JUnit5和一些Mockito)。我不是在寻找任何给定的解决方案,只是想说几句如何解决我的问题。

你在这里看到的是一些东西。。。首先检查在条件
objectToCSV!=null
(并且在
objectToXML!=null
下调用了
objectToXML::marshal
)。而且您很可能正在寻找
ArgumentCaptor
,也就是说,测试
objectToCSV::printRecord
objectToXML.marshal
实际上是通过您设置的
sentenceObject
调用的

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

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

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

  • 从构造函数中提取用于创建objectToCSV和objectToXML实例的方法只需最少的代码更改,并且对客户端是透明的。在这种情况下,您可以对类进行子类化,并重写生成器方法以返回mock

  • 如果不允许修改现有代码,我可以建议引入Powermock并模拟构造函数。注意:您必须运行junit4老式引擎,因为Powermock尚未移植到jUnit5。


我会询问任何要求您测试这个的人,看看您是否可以让他们将类更改为使用依赖注入。您会模拟
ObjectToCSV
ObjectToXML
的相关方法,并确保它们被调用。这就是说,
SplitterService
ctor的“selector”参数让我很难过,也不知道
size
是从哪里来的。在我看来,这更像是一个带有CSV和XML实现的接口。