【问题标题】:Is it possible to inject a context into another context?是否可以将上下文注入另一个上下文?
【发布时间】:2011-08-24 16:53:50
【问题描述】:

也许这个问题不是那么清楚,但举个例子,我想我会清楚的。在我的项目中,我有两种测试:集成测试和场景测试。他们都需要一个数据源(带有一个定制的属性占位符)。

在集成测试用例的上下文中,只定义数据源和占位符,如下所示:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<bean id="propertyResolver" class="com.cegeka.bibliothouris.test.MultiThreadedPropertyResolver">
    <property name="location"><value>classpath:testContext.properties</value></property>
</bean>

在我的场景测试用例上下文中,我也需要这些对象(连同其他一些东西),但我只想在我的场景上下文中创建一个集成上下文,因此需要某种继承。

我已经在我的场景测试用例中使用classPathApplicationContext 进行了尝试(曾经使用延迟初始化为 true),如下所示:

<bean class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>classpath:overridingTestContext.xml</value>
        </list>
    </constructor-arg>
</bean>

但他没有在场景上下文中创建dataSource。这是一个很难用谷歌搜索的问题,这就是我在这里问它的原因。我希望有人有解决方案。

【问题讨论】:

  • 为什么要搞得这么复杂(两种情况)?为什么不直接引用 secenario 测试用例配置中的集成测试用例配置,构建一个上下文?
  • 我不知道你的意思,我是Spring新手,但是scenariotest需要启动一个seleniumserver,一个seleniumhost和一个jettyserver,集成测试不需要。因此,当我运行集成测试时,不需要启动所有这些东西。如果需要第三个测试用例,它也需要使用数据源,我也可以将它导入那里。
  • Johan Sjöberg 在他的回答中描述的是一种从两个配置文件构建一个应用程序上下文的方法——这就是我所说的简单方法(不仅仅是参考集成测试用例配置) secenario 测试用例配置,并构建一个上下文)。你在你的问题中提出的问题(或者我有什么你尝试的)有点不同,你试图有两个不同的上下文,其中一个可以使用另一个(有点像 web 和应用程序上下文)。 -- 无论如何:我会推荐 Johan Sjöberg 的答案。

标签: java xml spring inheritance applicationcontext


【解决方案1】:

Spring 可以组合多个应用程序上下文,并通过只允许一个具有相同 id 的 bean 来提供类似继承的模型。如果两个 bean 共享相同的 id,则后者将覆盖前者。

因此,您可以使用例如

以正确的顺序简单地导入所需的配置
<import resource="context.xml" />

然而,行为确实取决于 setAllowBeanDefinitionOverriding 默认为 true。

这能回答你的问题吗?

【讨论】:

  • 我想我只需要把它放在我的其他豆子之间?我这样做了:,但是他还是找不到dataSource...
  • 据我了解,spring 会在下一个之前完全解析一个配置文件,因此将 import 语句放在两个 bean 之间并不重要。还要确保您指定了正确的资源路径(例如,通过使用 log4j 调试日志记录 spring)。
  • 嗯,我想我找到了问题所在。除了集成上下文和场景上下文之外,我的测试用例还需要注入一个应用上下文。他找不到数据源不是在场景上下文中,而是在应用程序上下文中。这实际上很奇怪,因为它在我运行集成测试时起作用,而在我运行场景测试时不起作用。
猜你喜欢
  • 2020-05-07
  • 2016-04-22
  • 1970-01-01
  • 2011-08-18
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多