我有一个像这样的 Spring Boot 测试:
@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
@Transactional
public class MyIntegrationTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private UserRepository userRepository;
...
@BeforeEach
public void init() {
// Mockito mocks
User u = new User();
u.setName("test");
userRepository.save(u);
}
@Test
void myTest() {
mockMvc.call to controller
}
}
我将
@Transactional
添加到测试类中,否则 save()
将在 init()
方法中失败。
控制器调用一个服务
ServiceA
,该服务最终调用另一个服务 ServiceB
,而该服务又调用 userRepository.findUserById(userId)
。
但是这个调用会抛出异常:
o.h.engine.jdbc.spi.SqlExceptionHelper:找不到表“用户” 未找到表“人”; SQL语句:insert into user(created_at, user_field1、user_field2、user_field3) 值 (?, ?, ?, ?) [42102-200] 无法准备声明; SQL [插入用户(created_at, 用户字段1、用户字段2、用户字段3)值(?, ?, ?, ?)];嵌套的 异常是 org.hibernate.exception.SQLGrammarException:不能 准备声明
这是为什么呢?测试方法注释为
@Transactional
。我尝试将 @Transactional
添加到调用存储库的 ServiceB
的方法中,但同样的错误。
该服务调用 userRepository。findUserById(userId)。
但是这个调用会抛出异常:
o.h.engine.jdbc.spi.SqlExceptionHelper:找不到表“用户”表 未找到“人”; SQL语句:insert into user(created_at, user_field1、user_field2、user_field3) 值 (?, ?, ?, ?) [42102-200] 无法准备声明; SQL [插入用户(created_at, 用户字段1、用户字段2、用户字段3)值(?, ?, ?, ?)];嵌套的 异常是 org.hibernate.exception.SQLGrammarException:不能 准备声明
你的问题不正确。该错误不会从
userRepository.findUserById(userId)
弹出,因为这不会触发插入 sql 查询。可能是 userRepository.save
触发了此错误。
检查是否以及如何扫描您的实体和存储库以正确配置数据库。