如何对调用私有方法的公共方法进行单元测试,然后又调用Web服务方法

时间:2016-10-18 06:18:18

标签: unit-testing mockito private-methods

以下是设置:

 public class ClassToTest{

    public void doSomething(ObjectToWorkOn[] objects){
        doPrivateStuff(objects);
    }

    private void doPrivateStuff(ObjectToWorkOn[] objects){
        List<ObjectToWorkOn> validObjects=new ArrayList<ObjectToWorkOn>();
        for(ObjectToWorkOn obj:objects){
           if(obj.isValid())
           validObjects.add(obj);
        }
        SomeWebService ws=new SomeWebService();
        ws.processObjects(validObjects);
    }

 }

我需要测试公共doSomething方法以检查是否过滤了invalidObjects。如您所见,它将objects传递给私有doPrivateStuff方法。并且该方法过滤掉无效对象并将有效对象发送到Web服务方法。该Web服务方法不返回任何内容。所以我不知道是否只有有效的对象被发送到Web服务方法。你有什么建议我能够测试这个案子?我正在使用Mockito框架来模拟对象。

1 个答案:

答案 0 :(得分:3)

您无法测试此方法的主要原因是您在班级中创建了SomeWebService

要解决此问题,您应该inject SomeWebService

public class ClassToTest{
    private readonly ISomeWebService someWebService;

    public ClassToTest(ISomeWebService someWebService)
    {
        this.someWebService = someWebService;
    }

    public void doSomething(ObjectToWorkOn[] objects){
        doPrivateStuff(objects);
    }

    private void doPrivateStuff(ObjectToWorkOn[] objects){
        List<ObjectToWorkOn> validObjects=new ArrayList<ObjectToWorkOn>();
        for(ObjectToWorkOn obj:objects){
           if(obj.isValid())
           validObjects.add(obj);
        }

        someWebService.processObjects(validObjects);
    }
}

现在,您可以在测试中模拟ISomeWebService依赖项,并验证是否使用正确的参数调用了processObjects方法