如何对调用私有方法并依次调用 Web 服务方法的 public 方法进行单元测试

How to unit test a public method that calls private method and that in turn calls a web service method

设置如下:

 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);
    }

 }

我需要测试 public doSomething 方法来检查是否过滤了 invalidObjects。如您所见,它将 objects 传递给私有 doPrivateStuff 方法。该方法过滤掉无效对象并将有效对象发送到 Web 服务方法。该网络服务方法没有 return 任何东西。所以我不知道是否只有有效的对象被发送到 web 服务方法。你建议我做什么来测试这个案例?我正在使用 Mockito 框架来模拟对象。

您无法测试此方法的主要原因是您在 class.

中创建了 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 方法