如何在测试期间注入测试实现,生产模式下的生产实现 - Spring,JSR-330

时间:2012-07-04 21:07:01

标签: spring dependency-injection inject jsr330

让我们假设我有音序器和以下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。

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用Spring 3.1引入的Spring Profiles,基本上定义一个名为“prod”和“test”的配置文件,让你的OracleSequencerprod个人资料中创建TestSequencer } test个人资料。

对于您的测试,请单独激活test个人资料,并激活您的prod个人资料。

以下是对个人资料的一个引用 - http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

您建议的另一个解决方案是使用sequencer覆盖测试中的TestSequencer bean,方法是指定一个与prod sequencer完全相同的bean,或者在新的应用程序中指定它在测试模式下导入的上下文。