仅在使用Mockito构造新对象时编写可测试代码

时间:2016-01-10 06:46:24

标签: java testing mockito

所以我正在写一门课程,我想遵循最佳实践并且可以测试。 我在其中创建了一个新对象。所以,我遵循工厂模式来实现它。

public class Apple {
    // factory object injected in class
    private SeedFactory seedFactory; 

    // Method to be tested 
    public void myMethod(String property1, int property2, String depends) { 
        // Just to set the necessary parameter
        seedFactory = new SeedFactory(property1, property2); 
        // Factory pattern intact. Instance generation depends on only one parameter
        SeedFactory result = seedFactory.getInstance(depends); 
    }
}

编辑:也为工厂添加代码。

public class SeedFactory{
String property1;
int property2;

SeedFactory(property1,property2){
this.property1 = property1;
this.property2 = property2;
}
SeedFactory getInstance(int depends){
if(depends == 1)
{ // do stuff }
else{ // do stuff and return instance }

现在,在我实际创建新对象之前,我必须确保为要生成的新实例设置两个属性,无论工厂生成的实例类型如何,都需要这些属性。 depends是实际参数,它告诉工厂返回什么实例。

现在,就此代码的可测试性而言,我可以使用PowerMockito使用whenNew来模拟工厂对象,但使用PowerMockito不是一种选择。没有它,我必须让它变得可测试。

另外,我尝试将new调用封装在一行函数中,然后使用spy。但是我想避免使用spy,因为在整个使用此代码的情况下,它不被视为一种好的做法。

所以我的问题是,有没有办法,不使用PowerMockito,重新编写这个类,以便它可以正确地进行单元测试?

如果要生成的实例只需要一个参数,那么它将是微不足道的。但是,我不想将多个参数传递给getInstance()

2 个答案:

答案 0 :(得分:2)

SeedFactory不是Apple的依赖,但您的方法取决于具有“使用”关系的SeedFactory。因此,为了定义正确的关系,我建议您使用“USES”关系,如下所示:

public void myMethod(SeedFactory seedFactory, String depends){ // Method to be tested 

现在您可以模拟SeedFactory并可以对其进行适当的单元测试。

答案 1 :(得分:0)

我认为你做错了什么。

如果SeedFactory不是Apple的依赖关系,而是内部问题,那么您就不需要模拟SeedFactory来测试{ {1}}。您应该只测试Apple提供的公共API。

如果AppleSeedFactory的依赖关系,那么肯定应该注入。