当前位置: 首页 > 知识库问答 >
问题:

Spring Boot集成测试回滚不起作用

胡劲
2023-03-14

在spring boot中,我试图创建我的第一个事务性测试,但trasaction不起作用。

@TestPropertySource(locations = "classpath:test.properties")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringJUnit4ClassRunner.class)
//@RunWith(SpringRunner.class)
@Transactional
@TestExecutionListeners(
    mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
    listeners = {TransactionalTestExecutionListener.class}
)
public class IntegrationTests
{
    @Autowired
    TemperatureLogRepository temperatureLogRepository;

    @Test
    @SqlGroup({
        @Sql(
            executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD,
            config = @SqlConfig(transactionMode = ISOLATED),
            scripts = "classpath:sqls/insertRecords2.sql"
        )
    })
    public void firstRepoTest() throws SQLException
    {
        assertThat(temperatureLogRepository.getFullList().size()).isEqualByComparingTo(0);
    }
}
    null

我需要的是:

  1. @sql将数据插入事务。
  2. getFullList()从事务中读取数据。
  3. 测试返回的数据。
  4. 回滚事务。

共有1个答案

齐俊达
2023-03-14

来自Spring Testing--使用@SQL以声明方式执行SQL脚本:

脚本执行阶段

默认情况下,SQL脚本将在相应的测试方法之前执行。但是,如果需要在测试方法之后执行一组特定的脚本(例如,为了清理数据库状态),可以使用@sql中的executionPhase属性,如下例所示。请注意,Iselate和AFTER_TEST_METHOD分别从sql.TransactionMode和sql.ExecutionPhase静态导入。

@Test 
@Sql(
    scripts = "create-test-data.sql",
    config = @SqlConfig(transactionMode = ISOLATED) ) @Sql(
    scripts = "delete-test-data.sql",
    config = @SqlConfig(transactionMode = ISOLATED),
    executionPhase = AFTER_TEST_METHOD ) 
public void userTest {
    // execute code that needs the test data to be committed
    // to the database outside of the test's transaction 
}
config = @SqlConfig(transactionMode = ISOLATED)
config = @SqlConfig(transactionMode = TransactionMode.INFERRED)

org.springframework.test.context.jdbc.sqlconfig.transactionmode.isolated

指示应始终在将立即提交的新的、独立的事务中执行SQL脚本。

 类似资料:
  • 问题内容: 我正在尝试使用Spring测试实体EJB3。 EJB本身不使用Spring,并且我想使生产JPA配置的重复保持最少(例如,不重复persistence.xml)。 我的单元测试似乎可以正常工作,但是即使我的单元测试应该是事务性的,数据仍会在各种测试方法之间持久存在…… 这是我的实体: 我的单元测试: 和我的appContext.xml: 当我运行测试时,test2失败,因为它找到了两个

  • 问题内容: 我有一个MySQL数据库,正在使用。 由于某些原因,我无法使事务正常运行。如果我打电话,它不会回滚。 示例代码: 结果是将另一行添加到myTable。谁能想到一个原因? 问题答案: 您使用的是myIsam还是innodb?据我所知,它仅适用于innodb

  • 问题内容: 是否有人对从集成测试框架(如Selenium)进行的回滚数据库事务的最佳实践或首选方式有任何建议? 这是当前的情况:我们有一个.net Web项目,其中包含许多在单元测试环境中可以正常工作的单元测试- 每个测试都继承一个父类,该父类在[SetUp]中打开一个事务,并在其中回滚该事务。 [TearDown]。每次测试后,我们的单元测试数据库都恢复到原始状态。 但是,一旦进入集成环境,情况

  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的