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