Зависимость загрузки в webmvctest

#java #spring #spring-boot #junit #mockito

#ява #весна #пружинный ботинок #юнит #мокито #java #весенняя загрузка #junit #mockito

Вопрос:

У меня есть контроллер rest, который я пытаюсь модульно протестировать:

У него есть несколько автоматически подключенных зависимостей

 @RestController
@RequestMapping("/test")
public class TestController {

    private final Dep1 dep1;
    private final Dep2 dep2;
    private final Dep3 dep3;

    public TestController(final Dep1 dep1,
                          final Dep2 dep2,
                          final Dep3 dep3) {
        this.dep1 = dep1;
        this.dep2 = dep2;
        this.dep3 = dep3;
    }
   
}
  

Недавно я добавил dep3

 @Service
public class Dep3 {

    private final IValidator validator;

    public Dep3(final IValidator validator) {
        this.validator= validator;
    }

    public void validate(final Request req) {
        validator.validate(req);
    }

}
  

Dep3 имеет свою собственную Автоматическую зависимость IValidator

Вот мой тестовый класс:

 @WebMvcTest(TestController.class)
public class TestControllerTest {

    @MockBean
    private Dep1 dep1;

    @MockBean
    private Dep2 dep2;

    @MockBean
    private Dep3 dep3;

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void someTest() throws Exception {

    }

    @TestConfiguration
    static class InnerConfiguration {

        @Bean
        IValidator validator() {
            return new SomeValidator();
        }
    }

}
  

Для моего теста мне нужен код, который действительно выполнит dep3.validate(..) реализацию SomeValidator() . Я не уверен, как этого добиться. Возможно, я упускаю аннотацию?

Ответ №1:

Не издевайся Dep3 . Вместо этого настройте Dep3 компонент в @TestConfiguration :

 @TestConfiguration
static class InnerConfiguration {

        @Bean
        Dep3 dep3() {
            return new Dep3(validator());
        }

        @Bean
        IValidator validator() {
            return new SomeValidator();
        }
    }
  

Пружина введет полностью настроенный Dep3 в TestController

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

1. В моей IntelliJ idea, в реальном основном классе, когда я нажимаю на зависимость, он выбирает dep3 из src / test. Разве это проблема ? Как избежать этого, если известно?

2. Основной класс (с аннотацией @SpringBootApplication) не должен сканировать тестовые пакеты в поисках компонентов. Как вы настраиваете компонент Dep3 в src / main?

3. основной класс аннотируется с помощью @SpringBootApplication, а Dep3 — с помощью @ Service аннотации

4. Я не могу воспроизвести такую проблему. Я мог бы лучше понять проблему, если бы у меня был полный исходный код

Ответ №2:

Вы должны правильно настроить свой макет. Что-то вроде этого:

 Mockito.when(dep3.validate(Mockito.any(Request.class))).thenReturn(new SomeValidator());
  

Вы можете сделать это в своем методе тестирования или в методе установки перед фактическим вызовом.