我有一个 Spring Boot 应用程序,可生成大量控制器,我的目标是为特定控制器创建集成测试。我读到我们可以用以下方法实现测试切片@WebMvcTest
仅加载部署目标控制器所需的注释,这个假设正确吗?这是我的测试:
@RunWith(SpringRunner.class)
@WebMvcTest(
controllers = {DummyController.class},
)
public class DummyControllerIT {
@Autowired
private MockMvc mockMvc;
...
不幸的是,执行尝试部署与目标控制器无关的其他控制器/服务/存储库,这迫使我使用@MockBean
在他们每个人身上。我的印象是@WebMvcTest
将使我不必拥有声明的控制器/服务/存储库的广泛列表@MockBean
注解,我错了吗?
如果我误解了这一点并且我应该使用@MockBean
在应用程序的不相关部分,然后为什么更好 to use @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
不会关闭这些显式启用的部分,因此您不得不模拟事物。
这个问题以及避免它的推荐方法是参考文档中描述 https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-user-configuration。简而言之,您应该移动各种@Enable…
注释来分隔@Configuration
通过组件扫描拾取的类。您可能还想查看其中一些的必要性。例如,@EnableTransactionManagement
被自动配置覆盖。
您的使用@ComponentScan
也有问题,因为它关闭了过滤@WebMvcTest
需要。将其移离@SpringBootApplication
- 带注释的类应该解决这部分问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)