Как модульно протестировать общедоступный метод, который вызывает частный метод и который, в свою очередь, вызывает метод веб-службы

#unit-testing #mockito #private-methods

#модульное тестирование #mockito #частные методы

Вопрос:

Вот настройка:

  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 метод. И этот метод отфильтровывает недопустимые объекты и отправляет допустимые в метод веб-службы. Этот метод веб-службы ничего не возвращает. Поэтому я понятия не имею, были ли отправлены только допустимые объекты в метод веб-службы или нет. Что вы предлагаете мне сделать, чтобы иметь возможность протестировать этот случай? Я использую Mockito framework для макетирования объектов.

Комментарии:

1. Обычно вам не нужно модульно тестировать метод, который является сквозным для другого метода, если вы не делаете в нем что-то еще (например, проверка вашего параметра). Во всяком случае, это был бы интеграционный тест. Если вы ДЕЙСТВИТЕЛЬНО хотите модульное тестирование, переопределите функцию doPrivateStuff() и убедитесь, что передача происходит.

Ответ №1:

Основная причина, по которой вы не можете протестировать этот метод, заключается в том, что вы создаете SomeWebService внутри своего класса.

Чтобы решить эту проблему, вы должны внедрить 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 зависимость в test и проверить, что processObjects метод был вызван с правильными аргументами

Комментарии:

1. Да, Дмитрий, это действительно был ключевой момент. Спасибо за понимание.