作为学习经验,我正在尝试将 Spring Boot 的 kotlin 教程 ( https://spring.io/guides/tutorials/spring-boot-kotlin/ ) 中描述的测试从使用 JUnit 5 移植到 KotlinTest。
在使用 注释的存储库测试中@DataJpaTest
,我设法很好地自动装配我的 JPA 存储库。但是自动装配 Spring BootTestEntityManager
不起作用,正如我java.lang.IllegalStateException: No transactional EntityManager found
在测试中尝试使用它时所得到的那样。
除了@DataJpaTest
,我尝试添加@Transactional
,但没有运气。
使用 JUnit5 运行测试时,使用 entityManager 持久化实体可以正常工作。
@DataJpaTest
class RepositoriesTests @Autowired constructor(
val entityManager: TestEntityManager,
val userRepository: UserRepository,
val articleRepository: ArticleRepository) {
@Test
fun `When findByIdOrNull then return article`() {
val juergen = User(login = "springjuergen", firstname = "Juergen", lastname = "Hoeller")
entityManager.persist(juergen) <--- OK
但是使用 KotlinTest,它失败了:
@DataJpaTest
class RepositoriesTests @Autowired constructor(
val entityManager: TestEntityManager,
val userRepository: UserRepository,
val articleRepository: ArticleRepository) : StringSpec() {
init {
"When findByIdOrNull then return article" {
val juergen = User(login = "springjuergen", firstname = "Juergen", lastname = "Hoeller")
entityManager.persist(juergen) <--- FAIL
错误是java.lang.IllegalStateException: No transactional EntityManager found
.
我一直无法弄清楚如何在使用 KotlinTest 实现的测试中提供这个实体管理器。