#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. Да, Дмитрий, это действительно был ключевой момент. Спасибо за понимание.