spring-boot - 集成测试值插入数据库
问题描述
我正在尝试使用 Spring Boot 集成测试来测试 JpaRepository。我正在使用没有嵌入式数据库的 @DataJPATest 注释。我正在使用与开发相同的 MySQL 数据库来运行集成测试。
@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
class UserRepositoryTest {
@Autowired
UserRepository userRepository;
@Test
void findByUsername() {
User u = new User();
u.setUsername("ML");
u.setFirstname("Micheal");
u.setLastname("Lane");
u.setActive(true);
userRepository.save(u);
assertThat(userRepository.findByUsername("M21")).isNotNull();
}
}
我在测试中插入的值被插入到实际的数据库中。但我认为使用@DataJpaTest 事务会在测试结束时回滚。
默认情况下,使用 @DataJpaTest 注释的测试是事务性的,并在每个测试结束时回滚。他们还使用嵌入式内存数据库(替换任何显式或通常自动配置的数据源)。@AutoConfigureTestDatabase 注释可用于覆盖这些设置。
那么为什么我的数据会保存到数据库中呢?是因为我没有使用嵌入式数据库吗?
使用的方言:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
****************************************************** ********8
一旦我从测试方法中删除 findByUsername() 部分,它就开始回滚
User u = new User();
u.setUsername("ML");
u.setFirstname("Micheal");
u.setLastname("Lane");
u.setActive(true);
userRepository.save(u);
//assertThat(userRepository.findByUsername("M21")).isNotNull();
所以我猜它不起作用,因为有 2 个查询。我将不得不使用已保存的数据进行 findByUsername() 测试
解决方案
我相信这是由于自动接线。当您自动连接时,它通过依赖注入实例化接口。如果您不想在运行测试时存储数据,我建议您查看mockito。在那里您可以模拟存储库,以便您可以测试存储数据时使用的所有方法,但从不实际保存它
推荐阅读
- python - 尝试在要素服务 Python API 1.7 for ArcGIS 中删除要素时出现错误消息
- r - 我需要帮助来改进此 R 代码以从 xlxs 中的每个工作表中提取特定单元格
- java - 调试可能存在内存泄漏的tomcat应用程序
- odata - 带有 $batch 变更集的 PATCH 调用
- html - 升级到引导程序 4 后网格列换行
- cygwin - 在cygwin中找不到autopep8
- docker - 了解 `docker-compose pull` 的输出
- android - 如何将 ReactNative 应用程序设置为默认系统应用程序?
- php - 路线 [] 未定义。laravel 6.2 中使用 Route::currentRouteName() 函数出错
- c# - 使用 QueryExpressionPlan 将提示传递给休眠