让我们假设我有音序器和以下Beans。 Sequencer负责从数据库序列中获取下一个值。 OracleSequencer用于生产模式,即JUnit-Tests期间的TestSequencer。
public interface Sequencer{
long getNextValue();
}
@Named("OracleSequencer")
public class OracleSequencer implements Sequencer[
...
}
@Named("TestSequencer")
public class TestSequencer implements Sequencer[
...
}
这就是我想要的方式:
@Named
public class BusinessBean{
@Inject
private Sequencer sequencer;
}
我的问题是: 当我在生产模式下运行应用程序时,我想在 BusinessBean 中注入 OracleSequencer ,当我运行JUnit-Test时,我想注入 TestSequencer 。是否可以使用JSR-330(@Inject,@ Name)?
我找到了2个脏解决方案:
在测试开始时,可以在bean中替换Sequencer,它取自Spring-ApplicationContext。当原型适当且TestSequencer没有任何其他依赖项时,它是可能的:
BusinessBean bean = springContext.getBean(..); bean.setSequencer(new TestSequencer());
我们可以使用@TestScope使用@ProductionScope和TestSequencer注释OracleSequencer,并将Spring配置为以适当的模式扫描合适的注释。
你有没有其他想法如何解决这个问题?
春季3.1。
答案 0 :(得分:0)
一种解决方案是使用Spring 3.1引入的Spring Profiles,基本上定义一个名为“prod”和“test”的配置文件,让你的OracleSequencer
在prod
个人资料中创建TestSequencer
} test
个人资料。
对于您的测试,请单独激活test
个人资料,并激活您的prod
个人资料。
以下是对个人资料的一个引用 - http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/
您建议的另一个解决方案是使用sequencer
覆盖测试中的TestSequencer
bean,方法是指定一个与prod sequencer完全相同的bean,或者在新的应用程序中指定它在测试模式下导入的上下文。