#java #junit #mockito #powermock #spring-test
#java #junit #mockito #powermock #spring-тест
Вопрос:
Я встречаю вопрос о фиктивном частном методе во внедренном фиктивном аннотированном классе. Мой код выглядит следующим образом
public class foo {
@Autowired
fooBean fooBean;
public void method1() {
this.method2();
}
private void method2() {
fooBean.someMethod();
system.out.println("Hello world");
}
}
когда я создаю класс UT с помощью powermockito, класс foo должен быть @InjectMocks, поскольку FooBean должен быть введен как макет класса. Но когда класс foo помечен как @InjectMocks, он не может имитировать свой частный метод, используя, например, «doReturn(«xxx»).когда (foo,»method2″)», это вызовет ошибку о том, что это не может быть применено к InjectMocks.
Он заблокирован. Не знаю, как продолжить.
Комментарии:
1. Протестируйте общедоступный API. Игнорируйте частные методы.
2. Если ваш тестовый класс тестируется
foo
, вы не должны издеваться над методамиfoo
, только над его зависимостями. Если есть какой-то код,method2
который не будет работать в тестовой среде, подумайте о том, чтобы перенести его в другой класс, который затем смоделирован и введенfoo
. Другое (плохое) решение — сделатьmethod2
protected и расширитьfoo
с помощью специального подкласса test.
Ответ №1:
TLDR; вы не можете использовать InjectMocks для издевательства над частным методом.
Вы должны смоделировать детали реализации и сосредоточиться на ожидаемом поведении приложения. Также важно, чтобы частные методы не выполняли логику тестирования ядра в вашем java-проекте.
Сосредоточьтесь на написании функций таким образом, чтобы частный метод не препятствовал тестированию. Если это невозможно, стоит спросить, что делает частный метод, который так ценен для вашей функции, и почему он должен быть частным.
Существуют и другие способы тестирования частных методов — вы можете использовать библиотеку Reflections java, это позволит вам останавливать методы во время выполнения и вводить в них определенные значения. Но, опять же, это поиск решения проблемы, которая не должна существовать.
Комментарии:
1. Ну, если вам действительно нужно, вы можете в своем модульном тестировании объявить класс bar, который расширяет foo, и заменить один из методов на макет…