5

在我的 spring + maven 应用程序中,我为数据访问层创建了一些测试,现在我想针对多个数据源运行这些测试。我有类似的东西:

@ContextConfiguration(locations={"file:src/test/resources/testAppConfigMysql.xml"})
public class TestFooDao extends AbstractTransactionalJUnit38SpringContextTests {
  public void testFoo(){
     ...
  }
} 

它当前具有硬编码的配置位置,因此它只能用于一个数据源。两次调用测试并通过两个不同的配置(比如 testAppConfigMysql.xml 和 testMyConfigHsqlDb.xml)的最佳方法是什么?

我已经看到通过系统属性执行此操作的建议。如何告诉 maven 使用不同的系统属性值调用测试两次?

4

3 回答 3

1

我不知道是否有一些性感和花哨的解决方案,也很简单,为此。我将使用所有测试内容实现基类,然后将其继承到具有不同基于注释的配置的 2 个类中,如下所示:

@ContextConfiguration(locations={"firstDs.xml"})
public class TestFooDaoUsingFirstDs extends TestFooDao {
}

@ContextConfiguration(locations={"secondDs.xml"})
public class TestFooDaoUsingSecondDs extends TestFooDao {
}

除非您必须以这种方式处理大量不同的数据源,否则这对我来说没问题。

于 2012-04-27T09:56:49.293 回答
0

而不是file:...,您可以使用classpath:...(删除src/test/resources,如果您使用,它是隐含的classpath)。然后你可以有一个单一的主上下文与该行:

<import resource="dao-${datasource}.xml" />

如果您使用 option 运行 Maven 构建-Ddatasource=foo,它将用${datasource}您指定的任何内容替换主上下文中的 。因此,您可以针对不同的配置拥有datasource-foo.xmldatasource-bar.xml

(您需要在 POM 中启用 Maven 资源过滤才能使其工作)。

或者,查看 Spring 3.1 中的新内容:http ://www.baeldung.com/2012/03/12/project-configuration-with-spring/

编辑:第三种选择是让所有测试类扩展一些超类,并使用 Junit's @Parameterised,其中参数是不同的 Spring 上下文。在那种情况下你不能使用@ContextConfiguration,但你总是可以手动创建 Spring 上下文,然后使用自动装配测试类org.springframework.beans.factory.config.AutowireCapableBeanFactory.autowireBean()

于 2012-04-27T10:16:34.180 回答
0

检查maven 调用程序插件。它也支持配置文件。

于 2012-04-27T11:50:00.030 回答