我在理解有关如何在Spring进行集成测试时完成回滚的过程中遗漏了一些东西。
我遇到的问题是以下代码有效。在测试运行之前,插入相关数据使测试通过。测试完成后,测试数据不再在数据库中。一切正常。
@ContextConfiguration( { Configs.TEST })
public class EndpointDaoBeanIT extends AbstractTransactionalJUnit4SpringContextTests {
// Since I have two datasources I need to explicitly state wich to use.
@Override
@Resource(name = "ds1")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private MyDao myDao;
@Before
public void init() {
final String insertSql =
"INSERT INTO T1 (" +
" ID) " +
"VALUES (?)";
// define query arguments
Object[] params = new Object[] { "iddd" };
// define SQL types of the arguments
int[] types = new int[] { Types.VARCHAR };
jdbcTemplate.update(insertSql, params, types);
}
@Test
public void testGetId() {
SomeType t1 = myDao.getbyId("iddd");
assertThat(t1.get(), equalTo("iddd"));
}
}
但是,在以下测试中,@Before
中的数据和testAddData()
中的数据都会保存在数据库中。导致测试通过第一次运行并且每次都失败(因为重复的id)。不知道我做错了什么,但我猜它有什么东西和我一起使用两种不同的连接?
@Test
public void testAddData() {
final String DATA_ID = "TestID2";
// Add data to database
myDao.addData(DATA_ID);
// Retrive added data
String testData = jdbcTemplate.queryForObject(
"SELECT SOME FROM TABLE WHERE DATA =?",
String.class, DATA_ID);
// Assert that it is the same data
assertThat(testData, equalTo(DATA_ID));
}
这是我的配置文件的相关部分:
<bean id ="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
...
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
<bean id="myJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="myDataSource" />
</bean>
我的问题是,abowe的例子是什么导致了secound测试中的数据是presistet而不是回滚?
我如何重写测试以预期的方式工作?