Тестовый фрагмент с @WebMvcTest загружает значительное количество контроллеров, не связанных с целью - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть приложение с пружинной загрузкой, дающее множество контроллеров, и моя цель - создать интеграционный тест для конкретного c. Я читал, что мы можем получить тестовый фрагмент с аннотацией @WebMvcTest, которая загружает только то, что необходимо для развертывания целевого контроллера, верно ли это предположение ? Вот мой тест:

@RunWith(SpringRunner.class)
@WebMvcTest(
        controllers = {DummyController.class},
)
public class DummyControllerIT {

    @Autowired
    private MockMvc mockMvc;

...

К сожалению, выполнение пытается развернуть другие контроллеры / службы / репозитории, которые не имеют отношения к целевому контроллеру, что вынуждает меня использовать @MockBean на каждом из них. У меня сложилось впечатление, что @WebMvcTest избавит меня от обширного списка объявленных контроллеров / служб / репозиториев с аннотацией @MockBean, я не прав?

Если я неверно истолковал это и я должен использовать @MockBean на несвязанных частях приложения, тогда почему лучше использовать @WebMvcTest вместо @SpringBootTest? С другой стороны, если я правильно понял, что мне не хватает?


Не уверен, что это связано, но это мой инициализатор:

@ComponentScan(scopedProxy = ScopedProxyMode.INTERFACES)
@SpringBootApplication
@EnableTransactionManagement
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableScheduling
@EnableCaching
@EnableJpaAuditing
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
public class Application extends SpringBootServletInitializer {

    @Autowired
    private Environment env;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    @Bean
    @Primary
    public TaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(Integer.parseInt(Objects.requireNonNull(env.getProperty("coreThreadPoolSize"))));
        executor.setMaxPoolSize(Integer.parseInt(Objects.requireNonNull(env.getProperty("maxThreadPoolSize"))));
        executor.initialize();
        return executor;
    }

}

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 14 февраля 2020

@WebMvcTest работает, отключая полную автоматическую настройку вашего приложения, а также фильтруя сканирование его компонентов, так что конфигурируются только необходимые компоненты. Ваш основной класс, Application, включает автоматическую настройку (через @SpringBootApplication), но также явно включает сканирование компонентов, а также кэширование, безопасность, репозитории JPA и т. Д. c. @WebMvcTest не отключает эти явно включенные фрагменты, поэтому вам придется издеваться над вещами.

Эта проблема и рекомендуемый способ ее устранения описаны в справочной документации . Короче говоря, вы должны переместить различные аннотации @Enable… в отдельные классы @Configuration, которые выбираются при сканировании компонентов. Вы также можете рассмотреть необходимость некоторых из них. Например, @EnableTransactionManagement покрыт автоматической настройкой.

Использование @ComponentScan также проблематично c, поскольку оно отключает фильтрацию, необходимую для @WebMvcTest. Удаление этого объекта из класса, помеченного @SpringBootApplication, должно решить эту часть проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...