Данные классы производственного кода:
@RestController
@RequiredArgsConstructor
public class MyController {
private final MyValidator validator;
// annotations relating to request mapping excluded for brevity
public void test(@Valid @RequestBody final MyParams params) {
// do stuff
}
@InitBinder
@SuppressWarnings("unused")
protected void initBinder(final WebDataBinder binder) {
binder.setValidator(validator);
}
}
и
@Component
@RequiredArgsConstructor
public class MyValidator implements Validator {
...
@Override
public void validate(final Object target, final Errors errors) {
// custom validation
}
}
и, наконец, тестовый код:
@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {
// tests
}
Я обнаружил ошибку:
NoSuchBeanDefinitionException: нет подходящего bean-компонента типа MyValidator: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат autowire. Аннотации зависимостей: {}
Думаю, ошибка вполне справедлива. Я аннотировал тест как WebMvcTest, который, как мне кажется, исключил @Component
beans. Это сделано намеренно и желательно (с точки зрения того, что я хочу протестировать только «веб-слой», а не весь контекст - так уж случилось, что мне нужен компонент, который связан / используется только в контроллерах)
Поэтому мой вопрос: как можно явно включить такой компонент, как валидатор, в тестовый контекст для веб-теста?
Моя среда - java version "10.0.2" 2018-07-17
, весенняя загрузка 1.5.16.RELEASE
.
SpringBootApplication
), запустит весь контекст Spring (все службы, репозитории, компоненты и т. Д.). Второй подход - это то, что я уже делаю: я мог бы использовать поддельный валидатор и написать отдельные модульные тесты для логики валидатора, чтобы охватить реализацию. Я также поэкспериментирую сWebMvcConfigurerAdapter
определением beans - поскольку я думаю, что эти beans тогда будут применяться в контексте. 17.10.2018