当前位置: 首页 > 知识库问答 >
问题:

使用上下文层次结构子上下文bean作为应用程序侦听器的Spring集成测试

贺高杰
2023-03-14

我是Spring的新手,如果我做了一些愚蠢的事情,请原谅我。我正在尝试为我的应用程序编写一个使用Spring的集成测试

我正在创建一个上下文层次结构,如下所示

  @Before
  public void setup(){
     parentContext = new AnnotationConfigApplicationContext(TestConfig.class);
     // some more setup stuff here
  }

在我的测试方法中,我试图创建一个新的子上下文,它只有一个bean,它是一个应用程序侦听器,依赖于父方法中的bean。

public void test(){
    childContext = new AnnotationConfigApplicationContext();
    childContext.setParent(ctx);
    register(TestConfig2.class);
    childContext.refresh();
    // some testing stuff here that generates events
}

我面临的问题是,来自子上下文的bean没有收到应用程序事件的通知,而且@Value注释也没有得到处理。

我到底做错了什么?

共有2个答案

崔棋
2023-03-14

事实上我知道出了什么问题。我的事件发布者位于父上下文中。我在spring论坛上读到,spring上下文层次结构就像类装入器一样工作。正如在子上下文加载的任何bean中一样,父上下文不可见。

因此,我必须手动将applicationlistener添加到父上下文中。

parentContext.addApplicationListener(messageListener);

如果希望我的childContext bean从parentContext获取属性,我必须将parentContext的PropertyPlaceHolderConfigure添加为BeanFactory后处理器。

  configurer = parentContext.getBean(PropertyPlaceholderConfigurer.class);
  childContext.addBeanFactoryPostProcessor(configurer);

综上所述,我必须在我的测试方法中做到以下几点

public void test(){
    childContext = new AnnotationConfigApplicationContext();
    childContext.setParent(parentContext);
    register(TestConfig2.class);
    configurer = parentContext.getBean(PropertyPlaceholderConfigurer.class);
    childContext.addBeanFactoryPostProcessor(configurer);
    childContext.refresh();

    MessageListener messageListener = childContext.getBean(MessageListener.class);
    parentContext.addApplicationListener(messageListener);

    // some testing stuff here that generates events
}
孙嘉
2023-03-14

申报

private static ClassPathXmlApplicationContext context;

at the method@之前

@BeforeClass
public static void setUpBeforeClass() throws Exception {
    context = new ClassPathXmlApplicationContext("/WEB-INF/application-Context.xml");
}

在methode@After

@AfterClass
public static void tearDownAfterClass() throws Exception {
    context.close();
}

你的方法测试

@Test
public void Test() {
    //Your Code Here
}

我也是Spring出发

 类似资料:
  • 我有一个关于Spring的ApplicationListener在父上下文和子上下文方面的性质的问题。假设您创建了一个父上下文,它创建了一个bean,该bean是一个单例,并注册为ApplicationListener。然后,使用父上下文创建子上下文。关闭子上下文时,Spring将发送ContextClosedEvent。该事件是否也会传播到父上下文,从而导致作为ApplicationListen

  • 我在web中配置了spring根web上下文。xml文件。我也有几个与此父项相关的子上下文。所有子上下文都是手动创建的: 我想在这个子上下文中管理会话和请求范围的bean。 如何正确创建和配置子上下文,使其能够处理web应用程序范围? 现在我在尝试自动装配会话范围的bean时出现以下错误(显然):

  • 说当Spring上下文层次结构关闭时,没有保证豆子将被销毁的顺序是正确的吗?例如,子上下文中的豆子将在父上下文中销毁。从一个最小的例子来看,上下文的破坏似乎在上下文之间是完全不协调的(奇怪的是)。这两个上下文都注册一个 shutdown hook,稍后将在不同的线程中执行。 给出输出: 有没有办法强制以“正确”的顺序关闭上下文?

  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 我需要在REST级别编写一个e2e测试,发送真正的请求。所以我想用应用上下文,而不是嘲讽豆。 有一个自动连接的,以及此<code>MyService。类依赖于两个存储库类。因此,我尝试模拟,并以以下方式将它们注入真正的: 但我得到了以下错误: 我还尝试使用< code > @ context configuration(classes = { my config . class })没有成功: 我

  • Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上,并添加了一些可能系统中所有组件将使用或偶尔需要的功能。 引导应用程序上下文 一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解