You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试中JPA写入DB的用户无法被REST接口访问的问题

解决测试用例中创建用户后Web层无法访问的问题

1. 修复事务隔离问题

Spring Boot测试默认会给测试方法添加@Transactional注解,且测试结束后自动回滚事务。这导致你通过Repository创建的用户仅在当前测试事务内可见,而TestRestTemplate发起的请求属于独立的Web层事务,无法读取未提交的数据。

解决方式:给创建用户的方法单独设置新事务传播级别,强制事务提交:

import org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.annotation.Propagation

@Transactional(propagation = Propagation.REQUIRES_NEW)
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)
    // 无需手动flush/clear,REQUIRES_NEW事务结束后会自动提交到数据库
    return loginDTO
}

也可以在测试类上添加@Rollback(false)关闭全局事务回滚,但这种方式会残留测试数据,需手动清理。

2. 确认数据源一致性

检查测试环境与Web层的数据库配置是否一致:

  • 若使用H2内存数据库,需在application-test.yml中配置DB_CLOSE_ON_EXIT=FALSE,避免连接关闭后数据丢失;
  • 若使用Testcontainers,确保Web层数据源正确指向容器内的数据库实例;
  • 验证测试用例和Web服务使用的是同一个数据源配置。

3. 排查缓存干扰

如果用户查询逻辑存在缓存(如Spring Cache、Redis),创建用户后需清理对应缓存:

// 在_createUserGetLoginDTO方法末尾添加缓存清理
cacheManager.getCache("userCache")?.evict(user.username)

或者在测试环境中临时禁用用户查询的缓存配置,确保每次查询直接访问数据库。

4. 验证用户写入结果

可以在创建用户后立即查询数据库,确认用户确实被持久化:

// 在_createUserGetLoginDTO方法末尾添加验证
val savedUser = itrUserRepository.findByUn(user.username!!)
assert(savedUser.isPresent) { "用户未成功写入数据库" }

内容的提问来源于stack exchange,提问作者mikeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:16:01