java - 使用 Spring Test 执行 SQL 脚本正在提交更改

标签 java spring junit spring-transactions spring-test

我正在尝试使用 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)执行所有数据库操作,那么它会起作用,因为内部如何确定事务的范围。我的选择是:

  1. 弄清楚如何运行 SimpleJdbcTemplate.update 以及我在同一事务中测试的后续实际代码。我想我有可能做到这一点,但迄今为止我的努力没有结果。

  2. 通过 SessionFactory 设置所有测试数据。因此,我不是通过 JDBC 直接执行 SQL 脚本,而是填充模型对象并通过 Hibernate DAO 保存它们。

我走的路正确吗?谁能提供更多指导吗?

最佳答案

您可能在数据库连接上启用了自动提交。

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="defaultAutoCommit" value="false"/>
</bean>

请注意,您可能还会在 jdbc url 中传递此参数。

关于java - 使用 Spring Test 执行 SQL 脚本正在提交更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9673815/

相关文章:

java - 在运行应用程序之前检测/测试 @Autowired 没有唯一的 bean

unit-testing - GWT JUnit 测试

java - ActionBar 后退按钮从内部 Fragment 完成 Activity

Java Spring CronTrigger 立即启动

java - 暂时跳过 hibernate 验证

maven - 在 Azure Devops 中发布测试结果任务

java - 如何隔离 void print() 方法进行测试

java - Java 的 nBuilder 替代品

java - Android list ,菜单不起作用

java - Apache POI 保留现有的 Excel 格式样式