如何调用另一种方法的单元测试方法?

时间:2014-03-10 22:17:51

标签: java oop unit-testing junit mocking

如何测试调用其他方法的方法?在我的示例中,我想知道如何测试调用initComponentsTypeA方法的create

public MyClass{

private List<TypeA> componentsTypeA;

public void initComponents(Config c){   
    componentsTypeA = initComponentsTypeA(c);
    //...
}

private List<TypeA> initComponentsTypeA(Config c){
    //...
    List<MyObject> someList = c.getSomeList();
    List<TypeA> localList = new ArrayList<>();
    for(MyObject mo : someList){
        localList.add(create(mo));
    }
    return localList;
}

private TypeA create(MyObject myObject){
    // ...
}
}

我知道一种解决方案是以这种方式重构代码(如下所示)。但这有必要吗?这是唯一的解决方案吗?

public MyClass{

private List<TypeA> componentsTypeA;

public void initComponents(Config c){   
     List<MyObject> myObjectList = initComponentsTypeA(c);
     componentsTypeA = create(myObjectList)
    //...
}

private List<MyObject> initComponentsTypeA(Config c){
    //...
    List<MyObject> someList = c.getSomeList();
    return someList;
}

private List<TypeA> create(List<MyObject> myObjectList){
    // ...
}
}

在第二个重构示例中,方法的名称也应根据其含义进行更改。

3 个答案:

答案 0 :(得分:1)

您可以使用mockito并创建一个返回实际方法的模拟,然后覆盖您想要模拟的方法的行为,或者使用spy,它会创建一个包装对象的真实实例的模拟。

这是关于mockito spy的教程。

修改

由于要模拟的方法是私有的,并且如@fge所提到的,您需要模拟库来公开私有方法。而powermock就是这样做的。

答案 1 :(得分:1)

鉴于initComponentsTypeA是私有方法,您不会直接对其进行单元测试。您只想对您的公共方法进行单元测试,然后运用您的私有成员。您可以通过查看调用私有方法所产生的副作用来确认私有方法的效果。

因此,在您的情况下,您将测试initComponents。为了查看initComponents内的内容,您可能需要传入一个模拟Config对象,以便验证它是否正确使用并控制它在{{1}时返回的内容。 } 叫做。通过查看您对getSomeList的调用对initComponentsTypeA的其他属性的影响,您可以确认createinitComponents的效果。

如果您无法查看对MyClass的更改,则需要考虑重构您的课程以使其成为可能。您需要将测试视为从另一个将要使用MyClass的类的persective中测试MyClass。如果该类无法看到或受益于调用MyClass的效果,则对任何人都没有多大用处。

希望答案不要过于模糊......如果您希望我澄清上面所述的任何内容,请告诉我。

答案 2 :(得分:0)

你需要选择。 要么将所有私有内容委托给其他类,这些方法现在都是公开的,你的问题就会消失。

或者你说所有私人内容都是私密的,因为你没有测试实现。对initComponents的任何测试都必须是间接测试。

如果从单元测试的角度看它是私有的,你可以摆脱,重命名或以其他方式扭曲MyClass的实现,并希望对它的行为没有影响。

这是一个黑盒子,或者它不是......