【发布时间】:2010-07-21 20:47:12
【问题描述】:
我如何在其他应用程序上下文中将一个 ApplicationContext 定义为原型 spring bean。我还需要将当前上下文作为父级传递给新的应用程序上下文。
详情:
我有 Bean,它代表富客户端应用程序中的一个用户会话。此类管理应用程序上下文的生命周期,以及一些其他对象(如数据库连接)。此会话 bean 本身由特殊的“启动应用程序上下文”配置。
现在我想对这个会话 bean 进行单元测试,但是遇到了麻烦,因为在会话 bean 中创建了特定于会话的应用程序上下文,并且有很多依赖于“启动上下文”;
示例代码:
public class UserDBAminSession implements ApplicationContextAware, UserSession {
ApplicationContext startupContext;
ApplicationContext sessionContext;
public void setApplicationContext(ApplicationContext startupContext) {...}
public void start() {
createSessionContext() ;
}
private void createSessionContext() {
sessionContext = new ClassPathXmlApplicationContext("admin-session.xml", startupContext);
}
}
出于测试目的,我希望使用类似这样的重复 createSessionContext 函数代码:
sessionContext = startupContext.getBean("adminContext", ApplicationContext.class);
然后我可以创建 startupContext 的模拟,返回一些存根。甚至 DI“会话上下文”在未来的某个时候会在春天变成 bean。但是,我不知道如何将父上下文参数传递给 ClassPathXmlApplicationContext 构造函数。我正在尝试这样的事情,但它似乎不起作用:
<bean id="adminContext" class="org.springframework.context.support.ClassPathXmlApplicationContext"
scope="prototype" autowire="constructor">
<constructor-arg type="java.lang.String">
<value>admin-session.xml</value>
</constructor-arg>
</bean>
我也在考虑在顶层创建应用程序上下文并通过 setter 传递它,但是:
- 这只是将问题移到更高级别,而不是解决。事实上它已经完成了(UserSession - 这是“顶级”)。
- 这打破了 RAII 模式。
- 这需要大量的代码重构。
或者制作特殊的“上下文工厂”对象,但它已经不是最好的代码了。
看起来很愚蠢,我不能从 IoC 框架本身进行 IoC 对象。可能是我误读了一些春季文档?
任何其他想法,如何对这个类进行单元测试?
【问题讨论】: