#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());
Вы можете сделать это в своем методе тестирования или в методе установки перед фактическим вызовом.