加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 基于Spring Boot的测试中的上下文层次结构

发布时间:2020-12-15 03:08:24 所属栏目:Java 来源:网络整理
导读:我的 Spring Boot应用程序启动如下: new SpringApplicationBuilder() .sources(ParentCtxConfig.class) .child(ChildFirstCtxConfig.class) .sibling(ChildSecondCtxConfig.class) .run(args); 配置类使用@SpringBootApplication注释.因此,我有一个根上下文
我的 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)

但这将产生单个上下文,我想要父子层次结构.
我假设我应该使用@ContextHierarchy注释来注释我的测试.

将我的测试注释更改为这似乎与前面的示例完全相同:

@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());
                }

            }

        };
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读