【发布时间】:2021-08-16 20:54:21
【问题描述】:
我的集成测试用@Transactional 注释,这样测试数据实际上并没有写入数据库。
现在我想测试一个实现的事务行为:
@Transactional
fun update(productTO: ProductTO): Product {
val product = findProduct(productTO.id).apply { price = productTO.price }
// should rollback
productPersistence.save(product)
// when this throws a RuntimeException
otherService.publishUpdate(product)
}
这是测试:
@Transactional
@Testcontainers
@SpringBootTest
class ProductTest {
@Test
fun `should rollback when sync fails`() {
val product = seedCreator.createProduct()
assertThat(product.price).isEqualTo(MonetaryAmount("5.00"))
// throw RuntimeException
Mockito.`when`(otherService.publishUpdate(any())).thenThrow(MyException())
assertThrows<MyException> {
sut.update(ProductTO(product.id, MonetaryAmount("10.00")))
}
// Verify that update was NOT applied
// Assertion fails!
assertThat(productPersistence.find(product.id))
.isNotNull()
.extracting(Product::price.name)
.containsExactly(MonetaryAmount("5.00"))
}
}
我想知道 @Transactional 本身的测试是否可以测试 @Transactional 实现的回滚行为?
【问题讨论】:
标签: spring jpa junit5 spring-transactions spring-boot-test