Spring中的JUnit测试 - 覆盖并忽略来自应用程序其他配置类的bean

时间:2013-03-22 15:15:57

标签: spring configuration junit javabeans

我们在Spring 3中编写了大型应用程序。我需要编写一些服务的JUnit测试检查行为。它不是一个单元,而是系统的一部分。有一些服务和存储库协同工作 - >里面注入了很多豆子。该应用程序还使用方面。

我的问题是。在这种测试的情况下如何管理配置和bean?我需要使用app configes和测试中定义的bean,只使用持久性来重新定义bean以使用嵌入式数据库。所以我需要使用src中的bean,因为它们被定义并仅覆盖一些导致麻烦的问题(持久性bean,bean使用webservices,......) 在测试包中,我使用数据源为hsql使Config类定义了bean的持久性。但我不知道接下来会发生什么。我试着用:

注释Test配置类
@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan(basePackages = "com.example.our.app")
public class MyTestConfig implements TransactionManagementConfigurer {

扫描整个应用程序并使用src文件夹中的bean配置。但这也会引起其他导致问题的测试。这是一个好的策略吗?现在用什么 - 使用excludeFilters删除其他测试配置?或者这个策略是不是很糟糕?

感谢

3 个答案:

答案 0 :(得分:2)

我认为这里使用的最佳方式是Spring profiles。 使用个人资料检查here now to use H2 for tests

答案 1 :(得分:2)

您可以使用@ContextHierarchy注释提供的上下文合并功能有选择地覆盖bean。

为了使这个用于您的用例,您必须创建一个基本上下文来扫描您的应用程序的Spring bean:

@Configuration
@ComponentScan({"com.example.our.app"})
public class MyTestConfig implements TransactionManagementConfigurer {

然后创建一个利用此上下文并将其命名为的基类 - 这不会使用命名的上下文!

@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy( {
    @ContextConfiguration(name="testContext", classes = MyTestConfig.class),
})
public class BaseTest {

最后编写一个扩展基类的单元测试,并使用相同的名称定义一个新的上下文,用一个特定于测试的配置覆盖单个bean:

    @ContextHierarchy(@ContextConfiguration(name="testContext", classes = OneUnitTest.Config.class))
    public class OneUnitTest extends AggroBaseTest {
      @Configuration
      static class Config {      
            ..
      }

答案 2 :(得分:0)

您也可以使用其他导入覆盖

    public enum TestEnum1{
    Null = 0,
    A,
    B,
    C,
    Last
}

    public enum TestEnum2{
    Null = 0,
    D = TestEnum1.Last,
    E,
    F,
    Last
}

public enum TestEnum3{
    Null = 0,
    A = TestEnum2.Last,
    B, 
    D,
}

如果你在课堂上

<beans>
    <import resource="classpath*:applocationContext.xml" />
    <bean id="dataSourceFactory" class=com.demo.MyNewClass/>
</beans>

检索该类,您将看到新类的实例

进一步

this.applicationContext.getBean("dataSourceFactory");

因此,有不同的方法可以覆盖默认行为