как смоделировать частный метод в аннотированном классе injectmocks в java

#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, и заменить один из методов на макет…