在我的spring + maven应用程序中,我已经为数据访问层创建了一些测试,我现在希望针对多个数据源运行。我有类似的东西:
@ContextConfiguration(locations={"file:src/test/resources/testAppConfigMysql.xml"})
public class TestFooDao extends AbstractTransactionalJUnit38SpringContextTests {
public void testFoo(){
...
}
}
目前配置位置是硬编码的,因此它只能用于一个数据源。 两次调用测试并传递两个不同配置的最佳方法是什么(比如testAppConfigMysql.xml和testMyConfigHsqlDb.xml)?
我已经看到过通过系统属性执行此操作的建议。如何告诉maven使用不同的系统属性值调用两次测试?
答案 0 :(得分:1)
我不知道是否有一些性感和花哨的解决方案,对此也很简单。我只是用所有测试内容实现基类,然后将它继承到具有不同基于注释的配置的2个类中,如下所示:
@ContextConfiguration(locations={"firstDs.xml"})
public class TestFooDaoUsingFirstDs extends TestFooDao {
}
@ContextConfiguration(locations={"secondDs.xml"})
public class TestFooDaoUsingSecondDs extends TestFooDao {
}
除非你必须以这种方式处理大量不同的数据源,否则对我来说没问题。
答案 1 :(得分:0)
而不是file:...
,您可以使用classpath:...
(删除src/test/resources
,如果您使用classpath
则隐含它。然后,您可以使用以下行显示单个主上下文:
<import resource="dao-${datasource}.xml" />
如果使用选项-Ddatasource=foo
运行Maven构建,它将使用您指定的任何内容替换主上下文中的${datasource}
。因此,您可以针对不同的配置设置datasource-foo.xml
,datasource-bar.xml
等。
(您需要在POM中启用Maven资源过滤才能使其生效)。
或者,查看Spring 3.1中的新内容:http://www.baeldung.com/2012/03/12/project-configuration-with-spring/
编辑:第三个选项是让所有测试类扩展一些超类,并使用
Junit的@Parameterised
,其中参数是不同的Spring上下文。在这种情况下你不能使用@ContextConfiguration
,但是你总是可以手动创建Spring上下文,然后使用org.springframework.beans.factory.config.AutowireCapableBeanFactory.autowireBean()
答案 2 :(得分:0)
检查maven invoker plugin。它也支持配置文件。