Есть ли способ включить пружинный компонент в WebMvcTest - PullRequest
0 голосов
/ 17 октября 2018

С учетом классов производственного кода:

@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: не доступен квалифицирующий компонент типа «MyValidator»: ожидается, что по крайней мере 1 компонент будет квалифицирован как кандидат для автоматической передачи.Аннотации зависимостей: {}

Я думаю, что ошибка достаточно справедлива.Я прокомментировал тест как WebMvcTest, который, как мне кажется, исключил @Component bean-компоненты.Это намеренно и желательно (с точки зрения того, что я хочу протестировать только «веб-слой», а не весь контекст - просто так мне нужен компонент, связанный / используемый только в контроллерах)

Поэтому мой вопрос: как можно явно включить такой компонент, как валидатор, в контекст теста для веб-теста?

Моя среда - java version "10.0.2" 2018-07-17, весенняя загрузка 1.5.16.RELEASE.

Ответы [ 2 ]

0 голосов
/ 26 августа 2019

Я не могу рекомендовать его как стандартную практику, но если вам нужен экземпляр зависимости в ваших тестах Web MVC (например, в устаревшем коде), вы можете добавить их в контекст Spring, используя @SpyBean аннотация.

Реальные методы этого класса будут вызываться во время теста, и вы можете проверить их при необходимости аналогично bean-компонентам, аннотированным @MockBean

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {

    @SpyBean
    private MyValidator validator
}
0 голосов
/ 17 октября 2018

Существует два способа сначала проверить веб-слой

.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyControllerTest {
  @Autowired
  private MyController myController;
}

Аннотация @SpringBootTest указывает Spring Boot пойти и найти основной класс конфигурации (например, один с @SpringBootApplication) и использовать его для запуска контекста приложения Spring.

Приятной особенностью поддержки Spring Test является то, что контекст приложения кэшируется между тестами, поэтому, если у вас есть несколько методов в тестовом примере или несколько тестовых случаев с одинаковой конфигурацией, они толькопонести стоимость запуска приложения один раз.Вы можете управлять кешем с помощью аннотации @DirtiesContext.

Во-вторых, если вы хотите использовать @WebMvcTest (MyController.class)

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {

  @MockBean
  private MyValidator validator;

}

Но этот валидатор - подделка, поэтому вы должны настроить его для тестирования.

См. эту ссылку для получения более подробной информации https://spring.io/guides/gs/testing-web/

...