如何使用Spring AbstractTransactionalJUnit4SpringContextTests进行回滚

时间:2015-06-08 09:36:32

标签: java spring

我在理解有关如何在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而不是回滚?

我如何重写测试以预期的方式工作?

0 个答案:

没有答案