0

让我们假设我有定序器和以下 Bean。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, @Named) 可以吗?

我找到了 2 个肮脏的解决方案:

  • 在测试开始时,可​​以在 bean 中替换 Sequencer,该 bean 取自 Spring-ApplicationContext。当原型合适并且 TestSequencer 没有任何其他依赖项时,这是可能的:

    BusinessBean bean = springContext.getBean(..); bean.setSequencer(new TestSequencer());

  • 我们可以用@ProductionScope 注释OracleSequencer,用@TestScope 注释TestSequencer,并配置Spring 以适当的模式扫描适当的注释。

你可能有其他想法如何解决这个问题?

春天 3.1。

4

1 回答 1

1

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

对于您的测试,test单独激活配置文件,然后您的产品激活prod配置文件。

这是对 Profiles 的一个参考 - http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

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

于 2012-07-04T21:25:31.357 回答