我有一个Spring Boot应用程序,可以产生许多控制器,我的目标是为特定控制器创建集成测试。我读到我们可以用@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;
    }

}


谢谢您的帮助。

最佳答案

@WebMvcTest通过禁用应用程序的完全自动配置并过滤其组件扫描来工作,从而仅配置所需的部分。您的主类Application正在启用自动配置(通过@SpringBootApplication),但还显式启用了组件扫描以及缓存,安全性,JPA存储库等。@WebMvcTest不会关闭这些显式启用的片段这样就不必再嘲笑了。

此问题和避免此问题的建议方法是described in the reference documentation。简而言之,您应该将各种@Enable…注释移到单独的@Configuration类中,这些类由组件扫描拾取。您可能还需要查看其中一些需求。例如,@EnableTransactionManagement被自动配置覆盖。

您使用@ComponentScan也是有问题的,因为它会关闭@WebMvcTest所需的过滤。将其从@SpringBootApplication注释的类中移开应该可以解决问题的这一部分。

10-06 12:40