gpt4 book ai didi

java - 使用 @WebMvcTest 的测试切片正在加载大量与目标无关的 Controller

转载 作者:行者123 更新时间:2023-12-01 19:29:25 26 4
gpt4 key购买 nike

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

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

@Autowired
private MockMvc mockMvc;

...

不幸的是,执行尝试部署与目标 Controller 无关的其他 Controller /服务/存储库,这迫使我在每个 Controller /服务/存储库上使用@MockBean。我的印象是 @WebMvcTest 将使我不必使用 @MockBean 注释声明 Controller /服务/存储库的广泛列表,我错了吗?

如果我误解了这一点,并且我希望在应用程序的不相关部分使用@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 带注释的类移开应该可以解决这部分问题。

关于java - 使用 @WebMvcTest 的测试切片正在加载大量与目标无关的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60224814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com