java – 基于Spring Boot的测试中的上下文层次结构
我的
Spring Boot应用程序启动如下:
new SpringApplicationBuilder() .sources(ParentCtxConfig.class) .child(ChildFirstCtxConfig.class) .sibling(ChildSecondCtxConfig.class) .run(args); 配置类使用@SpringBootApplication注释.因此,我有一个根上下文和两个子Web上下文. 我想编写集成测试,我希望在那里有相同的上下文层次结构.我想至少用他的父上下文(ParentCtxConfig.class)测试第一个子上下文(用ChildFirstCtxConfig.class配置).我怎样才能做到这一点? 目前我在我的测试中自动安装了ApplicationContext,以便我可以检查它.我在测试中有这个类注释: @RunWith(SpringRunner.class) @SpringBootTest(classes = { ParentCtxConfig.class,ChildFirstCtxConfig.class },webEnvironment = WebEnvironment.RANDOM_PORT) 但这将产生单个上下文,我想要父子层次结构. 将我的测试注释更改为这似乎与前面的示例完全相同: @RunWith(SpringRunner.class) @ContextConfiguration(classes = { ParentCtxConfig.class,ChildFirstCtxConfig.class }) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 但是如果我想介绍@ContextHierarchy并且有类似这样的东西: @RunWith(SpringRunner.class) @ContextHierarchy({ @ContextConfiguration(name = "root",classes = ParentCtxConfig.class),@ContextConfiguration(name = "child",classes = ChildFirstCtxConfig.class) }) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 由于在父上下文中定义的bean无法在子上下文中找到/自动装配,因此未启动上下文.设置loader = SpringBootContextLoader.class没有帮助. 示例代码:GitHub 解决方法
更新:彼得戴维斯提到的
This issue was fixed in Spring Boot 1.5.0.
这是@SpringBootTest的限制.准确移动,这是SpringBootContextLoader的限制.您可以通过使用自定义上下文加载器来配置父上下文或使用ContextCustomizer工作来解决它需要在spring.factories中列出的工厂.以下是后者的一个粗略示例: SRC /测试/资源/ META-INF / spring.factories: org.springframework.test.context.ContextCustomizerFactory= com.alex.demo.ctx.HierarchyContextCustomizerFactory SRC /测试/ JAVA / COM /亚历克斯/演示/ CTX / HierarchyContextCustomizerFactory.java: package com.alex.demo.ctx; import java.util.List; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfigurationAttributes; import org.springframework.test.context.ContextCustomizer; import org.springframework.test.context.ContextCustomizerFactory; import org.springframework.test.context.MergedContextConfiguration; public class HierarchyContextCustomizerFactory implements ContextCustomizerFactory { @Override public ContextCustomizer createContextCustomizer(Class<?> testClass,List<ContextConfigurationAttributes> configAttributes) { return new ContextCustomizer() { @Override public void customizeContext(ConfigurableApplicationContext context,MergedContextConfiguration mergedConfig) { if (mergedConfig.getParentApplicationContext() != null) { context.setParent(mergedConfig.getParentApplicationContext()); } } }; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – log4j:输出文件取决于源调用类
- Java GUI:文档对象模型
- jpa – 添加EntityListeners后的sun.reflect.annotation.Ty
- 如何在> = Java 9中将json的maven依赖项添加到模块中
- JSP Request.getUserPrincipal()方法:返回java.security.P
- Java – 通过递归测试字符数组是否为回文
- Java NIO Zip Filesystem相当于java.util.zip.ZipEntry中的
- java – 父pom.xml的包装无效,必须是“pom”,而是“ear”
- JSP自定义标签入门学习
- jxl 导出数据到excel的实例讲解