我有一个简单的JUnit测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/mysql-datasource-context.xml"})
public class EmployeeDAOTest {
@Autowired
EmployeeDao employeeDao;
@Test
public void findAllTest() {
assertTrue(employeeDao.findByName("noname").size() == 0);
}
}
mysql-datasource-context.xml的内容如下所示:
<context:component-scan base-package="my.packages.*"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/project"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="my.packages.entity"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
现在测试运行对我的mysql数据库没问题。
关键是我还有一个postgres数据库,我需要为mysql和postgres数据库进行每次测试。
我想到的唯一解决方案是创建一个具有完全相同测试的测试类,但将其注释为
@ContextConfiguration(locations = {"classpath:/postgres -datasource-context.xml"})
并为其创建一个以上的数据源上下文文件。不幸的是,这种方式看起来不是一个好的解决方案。
有没有更好的方法来解决我的问题?
答案 0 :(得分:1)
我认为最简单的解决方案是将测试类作为基础测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/mysql-datasource-context.xml"})
public class EmployeeDAOTest {
@Autowired
EmployeeDao employeeDao;
@Test
public void findAllTest() {
assertTrue(employeeDao.findByName("noname").size() == 0);
}
}
然后为postgres创建一个具有自己配置的空子类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/postgres-datasource-context.xml"}, inheritLocations=false)
public class EmployeeDAOTestPostgres extends EmployeeDAOTest {
}
正如其他建议你可以改变你的Spring配置文件,只有一个;例如,您可以将数据源放在单独的上下文中并导入或使用配置文件(请参阅here示例)
答案 1 :(得分:0)
一眼就是spring多数据源配置,实际上你可以通过google获得很多帖子或者在stackoverflow中快速搜索它
实施例: Spring Boot Multiple Datasource
我能想象的另一个解决方案是使用弹簧轮廓。
答案 2 :(得分:0)
我总是觉得最好有一个包含其他文件的顶级应用程序上下文文件:
appcontext-的ROOT.xml
<beans>
<import resource="appcontext-services.xml"/>
<import resource="appcontext-db.xml"/>
</beans>
然后您的应用程序可以运行context-root.xml,但您的测试可以测试一个(或多个)较低级别的文件。
如果您需要可交换的后端,可以考虑使用PropertyPlaceHolderConfigurer。
例如:
<import resource="appcontext-db-${vendor}.xml"/>
并拥有appcontext-db-mysql.xml,appcontext-db-postgres.xml以及System.setProperty("vendor", "mysql")