gpt4 book ai didi

spring - 如何使用@DataJpaTest 测试我的自定义 JPA 查询?

转载 作者:行者123 更新时间:2023-12-05 04:30:09 26 4
gpt4 key购买 nike

我编写了这个包含自定义查询的存储库:

@Repository
interface PersonRepository : JpaRepository<Person, UUID> {

@Query("UPDATE Person SET firstname = :firstname, lastname = :lastname WHERE id IN :ids")
@Modifying
fun updateNames(firstname: String, lastname: String, ids: List<UUID>) : Int
}

并为其实现了以下测试:

@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
internal class PersonRepositoryIntegrationTest {

@Autowired
lateinit var personRepository: PersonRepository

@Test
@Commit
fun updateNames() {

// GIVEN
// insert some records
personRepository.save(Person(UUID.randomUUID(), "Homer", "Simpson"))
personRepository.save(Person(UUID.randomUUID(), "Bart", "Simpson"))
personRepository.save(Person(UUID.randomUUID(), "Marge", "Simpson"))

// read back the ids and assert lastname before updating
val readBeforeUpdate = personRepository.findAll()
assertTrue(readBeforeUpdate.isNotEmpty())
assertTrue(readBeforeUpdate.all { it.lastname == "Simpson" })
val ids = readBeforeUpdate.map { it.id }

// WHEN
val count = personRepository.updateNames("John", "Doe", ids)
personRepository.flush()

// THEN
assertEquals(3, count)
val readAfterUpdate = personRepository.findAll()
println(readAfterUpdate)
assertEquals(3, readAfterUpdate.size)
assertTrue(readAfterUpdate.all { it.firstname == "John" && it.lastname == "Doe" })
}

}

在最后一行失败,验证所做的更改,例如名字和姓氏。我添加了 @Commit 来防止自动回滚 spring 会做,这样我就可以在之后检查数据。我可以在数据库中看到更改后的名称,所以看起来我的查询有效。我怀疑 val readAfterUpdate = personRepository.findAll() 要么是

  • 在与 personRepository.updateNames 不同的事务中执行,还不能“看到”其他事务的更改
  • 或者personRepository.findAll()从Hibernate的缓存什么的返回

我在这里错过了什么?如何使测试工作?或者还有什么方法可以检查数据库中的数据是否确实发生了更改?

展示该行为的示例项目可在 https://github.com/timbuethe/SpringBootDataTest 获得。

最佳答案

我认为使用 @Modifiying 会使持久性上下文过时,所以也许添加 (clearAutomatically = true) 可以解决问题

关于spring - 如何使用@DataJpaTest 测试我的自定义 JPA 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72128645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com