在进行集成测试时,我试图测试存储过程的执行情况。为此,我需要执行以下步骤:
写入的下游回购中的数据。
但是,在测试完成之后,我能够成功地完成所有这些工作,只有由存储过程编写的行才会回滚。通过JdbcAggregateTemplate插入的行不会回滚。显然,我可以在测试声明的末尾手动删除它们,但我觉得在配置中(可能是在@Transactional或@Rollback注释中),我肯定遗漏了一些东西。
@SpringBootTest
@Transactional
@Rollback
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class JobServiceIntegrationTest @Autowired constructor(
private val repo: JobExecutorService,
private val template: JdbcAggregateTemplate,
private val generatedDataRepo: GeneratedDataRepo,
) {
@Nested
inner class ExecuteMyStoredProc {
@Test
fun `job is executed`() {
// arrange
val supportingData = supportingData()
// act
// this data does not get rolled back but I would like it to
val expected = template.insert(supportingData)
// this data does get rolled back
repo.doExecuteMyStoredProc()
val actual = generatedDataRepo.findAll().first()
assertEquals(expected.supportingDataId, actual.supportingDataId)
}
}
fun supportingData() : SupportingData {
...
}
}如果这一切都是作为物理数据库事务的一部分完成的,我预计当外部事务回滚时,内部事务都会回滚。显然不是这样的,但这是我希望效仿的行为。
我已经做了大量的集成测试,它们都如我所期望的那样回滚,但通常我只是应用一些业务逻辑并将其写入到数据库中,没有比这更重要的东西了。其他测试中有关此测试的唯一唯一情况是,我正在执行存储的proc (并且存储的proc包含事务)。
我正在将这些数据写入一个Server,并在Kotlin中使用Spring。
发布于 2022-06-27 06:35:10
既然它似乎解决了这个问题,我的评论就成了一个答案:
我怀疑SP中的事务提交了先前的更改。你能为一个简单的SP发布代码吗?它会引起你所描述的问题,这样我就可以玩它了?
https://stackoverflow.com/questions/72738182
复制相似问题