使用 @WebMvcTest 的测试切片正在加载大量与目标无关的控制器

Joã*_*tos 0 java testing spring-boot

我有一个 Spring Boot 应用程序,可生成大量控制器,我的目标是为特定控制器创建集成测试。我读到我们可以使用注释实现测试切片,@WebMvcTest该注释仅加载部署目标控制器所需的内容,这个假设正确吗?这是我的测试:

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

    @Autowired
    private MockMvc mockMvc;

...
Run Code Online (Sandbox Code Playgroud)

不幸的是,执行尝试部署与目标控制器无关的其他控制器/服务/存储库,这迫使我使用@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;
    }

}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助。

And*_*son 5

@WebMvcTest其工作原理是禁用应用程序的完全自动配置,并过滤其组件扫描,以便仅配置所需的部分。您的主类Application正在启用自动配置(通过@SpringBootApplication),但也显式启用组件扫描以及缓存、安全性、JPA 存储库等。@WebMvcTest不会关闭这些显式启用的部分,因此您必须嘲笑的事情。

\n\n

参考文档中描述了此问题以及建议的避免此问题的方法。简而言之,您应该将各种注释移动到由组件扫描拾取的@Enable\xe2\x80\xa6单独类中。@Configuration您可能还想查看其中一些的必要性。例如,@EnableTransactionManagement被自动配置覆盖。

\n\n

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

\n