我正在尝试使用 Spring 在我的 JUnit 测试中执行 SQL 脚本。该脚本用于为测试设置数据。但是,当脚本运行时,脚本中的 INSERT 将在每次测试后提交。Spring 文档说不要期望使用 DDL 进行回滚,但我的脚本中的所有内容都是 DML。它只包含 INSERT 语句并获取最后一个插入 ID (SET @blah = LAST_INSERT_ID())。
我配置错了吗?我正在对 MySQL 数据库使用它。我们的配置如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class OrderTestCase extends AbstractTransactionalJUnit4SpringContextTests {
@Before
public void runSql() {
String fileName = StringUtils.replace(getClass().getName(), ".", "/") + ".sql";
Resource resource = applicationContext.getResource(fileName);
if (resource.exists()) {
executeSqlScript(fileName, false);
} else {
LOGGER.debug("Resource doesn't exist: {}", resource);
}
}
@Test
public void testLoadOrders() {
Collection<Order> orders= dao.findAll();
assertTrue(orders.size() == 3);
}
}
这是我根据一些研究认为正在发生的事情。第一次调用 executeSqlScript 在单独的事务中运行。Spring 的 SimpleJdbcTemplate.update 方法由 executeSqlScript 调用。因为这是从连接池获得的 JDBC 连接的范围,所以我不能保证在后续访问数据库时获得相同的连接,因此不能保证在同一个事务中运行。
如果我要通过 TransactionManager 或 (Hibernate Session Factory) 执行所有数据库操作,那么它将起作用,因为内部如何确定事务的范围。我的选择是:
弄清楚如何运行 SimpleJdbcTemplate.update 以及我在同一事务中测试的后续实际代码。我想我可以做到这一点,但到目前为止我的努力是徒劳的。
通过 SessionFactory 设置我所有的测试数据。因此,我不会通过 JDBC 直接执行 SQL 脚本,而是填充模型对象并通过 Hibernate DAO 持久化它们。
我在正确的轨道上吗?谁能提供更多指导?