Spring Junit Transaction在提交后不回滚

时间:2016-04-06 08:32:53

标签: java spring jdbc datasource rollback

我有一些我想测试的Spring服务。这些服务在开始时创建一个连接(池BasicDataSource),并在成功调用所有DAO ware后提交。

现在我想通过Spring junit测试它们,但最后的“commit”不会回滚(即使使用@Transactional)。

怎么能这样做(我已经读过spring将方法封装到一个事务中并将其回滚)?

@RunWith(SpringJUnit4ClassRunner.class)
//@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
@ContextConfiguration(locations = { "classpath:TestProject-spring-test.xml" })
@Transactional
public abstract class BaseTest {

    @Autowired
    protected BasicDataSource dataSource;

    @Autowired
    protected JdbcTemplate jdbc;


    @Test
    @Rollback(true)
    public void testTransactional() throws SQLException{
        jdbc.execute("INSERT INTO test (pk) VALUES (0)");

        Connection con = dataSource.getConnection();
        Statement stmt = con.createStatement();
        stmt.executeUpdate("INSERT INTO test (pk) VALUES (1)");
        con.commit();
        con.close();
    }

}

回滚jdbc.execute,但数据源检索的Connection不会回滚。

即使我提交连接,如何强制回滚?

1 个答案:

答案 0 :(得分:0)

正如@ M.Deinum所指出的,Spring对你的连接一无所知(直接来自你的数据源)所以你不能指望它回滚任何东西。您应该使用spring上下文(以及Spring管理的DAO)来执行测试。 See this example