2012-07-04 40 views
0

让我们假设我有定序器和下面的Beans。 Sequencer负责从数据库序列中获取下一个值。 OracleSequencer用于生产模式,即JUnit测试期间的TestSequencer。如何在测试期间注入测试执行,在生产模式下执行生产 - Spring,JSR-330

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; 
} 

我的问题是: 当我在生产模式下运行的应用程序,我想注入OracleSequencerBusinessBean,当我运行JUnit-Test我想要注入TestSequencer。 JSR-330(@Inject,@Named)有可能吗?

我发现2级脏的解决方案:

  • 在试验开始时,定序器可以在豆,其从弹簧的ApplicationContext截取来代替。原型合适且TestSequencer没有任何其他依赖关系时可能:

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

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

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

Spring 3.1。

回答

0

一个解决方案是使用Spring配置文件与Spring 3.1中引入,基本上是定义一个名为“刺”和“测试”的个人资料,让你的OracleSequencertest轮廓prod轮廓和TestSequencer创建。

为了您的测试,请单独激活test配置文件,然后您的prod激活prod配置文件。

这里是一个参考概况 - http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

喜欢你的建议将在与TestSequencer测试来覆盖你的sequencer豆另一种解决方案,通过指定具有完全相同的名称的bean作为您的督促序或指定它在一个以测试模式导入的新应用程序上下文中。