我有一个测试,通过 JPA 存储库创建用户,然后通过
TestRestTemplate
登录该用户
问题是在我使用存储库创建用户后,网络调用无法在数据库中看到该用户,即使在调用
entityManager.flush()
和 entityManager.clear()
之后也是如此
有问题的方法:
fun _createUserGetLoginDTO(): LoginDTO{
val password = passwordEncoder.encode(Instancio.create(String::class.java))
val user = getTestUser()
user.setPassword(password)
latestUser = user
itrUserRepository.save(user)
val loginDTO = LoginDTO(user.username!!, password)
entityManager.flush()
entityManager.clear()
return loginDTO
}
fun _createUserAndLoginReturningToken(): String {
val loginDTO = _createUserGetLoginDTO()
val tr = this.testRestTemplate.exchange(
"http://localhost:$port/auth/login", HttpMethod.POST, HttpEntity<LoginDTO>(loginDTO),
LoginResponse::class.java
) // Fails b/c user is not found?
Assertions.assertThat(tr.statusCode.value()).isEqualTo(200)
Assertions.assertThat(centralTokenStorageService.isValid(tr.body?.token!!)).isTrue()
entityManager.flush()
entityManager.clear()
return tr.body?.token!!
}
为了调试,我在用户详细信息服务中添加了一条消息,我可以看到我的用户查找失败,导致 403(我看到错误消息打印到 stderr):
@Bean
fun userDetailsService(): UserDetailsService {
return UserDetailsService { username ->
val u = itrUserRepository.findByUn(username)
if (!u.isPresent) {
System.err.println("************ User not found ${username}")
throw (UsernameNotFoundException("User $username not found"))
}
u.get()
}
}
如何使我插入的用户可用于 Web 层?
找到了,这种注释组合对我有用。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase
@AutoConfigureWebTestClient
由于某种原因,
AutoConfigure*
注释对其进行了排序。
如果您对某个问题投了反对票,请发表评论说明原因。