Spring 引导应用程序中的存储库应该直接测试吗?
Should repositories in Spring Boot applications be tested directly?
不确定这是否会被视为 "legitimate question" 或 "purely opinion based",但是是否有 "best practice" 关于在 Spring 引导应用程序中直接测试存储库?或者,任何集成测试都应该只针对关联的服务吗?
这个问题的原因很简单,在大多数情况下,Spring 启动应用程序中的存储库不包含项目生成的代码。充其量,它包含项目定义的方法签名,Spring 为其生成实现(假设正确的命名约定)。
谢谢...
是的,我认为这样做是一个很好的做法。您可以使用 @DataJpaTest 批注,它会启动一个内存数据库。官方文档说:
You can use the @DataJpaTest annotation to test JPA applications. By default, it configures an in-memory embedded database, scans for @Entity classes, and configures Spring Data JPA repositories. Regular @Component beans are not loaded into the ApplicationContext.
Link 到文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html
从存储库应该只在服务内部使用并且服务用于与系统的其他层交互的想法出发,我认为在大多数情况下测试服务应该足够了。
我不会测试 findAll 或 findBy 等标准存储库方法,它们已经过测试,目的不是测试 JPA,而是应用程序。
唯一应该具有直接测试的存储库方法是具有自定义查询的方法。这些查询可能位于共享库中,跨不同项目编写类似测试效率不高(在这种情况下回归是一个大问题)
如果你能搞砸,你应该测试一下。在这里搞砸的机会包括:
- 自定义查询(使用@Query)可能是错误的(在没有编译时检查的情况下可能会出现各种逻辑错误或拼写错误)
- 从方法名称派生查询的存储库方法可能不是您想要的。
- 传入的参数,参数列表中的类型可能与查询中所需的类型不匹配(编译时没有强制执行)。
在所有这些情况下,您不是在测试 Spring Data JPA,而是在测试使用 Spring Data JPA 实现的功能。
使用提供的方法的案例开箱即用,如findOne、findAll、save等,上面没有你的指纹,不需要测试。
测试这玩意很容易,早发现bug总比晚发现好。
不确定这是否会被视为 "legitimate question" 或 "purely opinion based",但是是否有 "best practice" 关于在 Spring 引导应用程序中直接测试存储库?或者,任何集成测试都应该只针对关联的服务吗?
这个问题的原因很简单,在大多数情况下,Spring 启动应用程序中的存储库不包含项目生成的代码。充其量,它包含项目定义的方法签名,Spring 为其生成实现(假设正确的命名约定)。
谢谢...
是的,我认为这样做是一个很好的做法。您可以使用 @DataJpaTest 批注,它会启动一个内存数据库。官方文档说:
You can use the @DataJpaTest annotation to test JPA applications. By default, it configures an in-memory embedded database, scans for @Entity classes, and configures Spring Data JPA repositories. Regular @Component beans are not loaded into the ApplicationContext.
Link 到文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html
从存储库应该只在服务内部使用并且服务用于与系统的其他层交互的想法出发,我认为在大多数情况下测试服务应该足够了。
我不会测试 findAll 或 findBy 等标准存储库方法,它们已经过测试,目的不是测试 JPA,而是应用程序。
唯一应该具有直接测试的存储库方法是具有自定义查询的方法。这些查询可能位于共享库中,跨不同项目编写类似测试效率不高(在这种情况下回归是一个大问题)
如果你能搞砸,你应该测试一下。在这里搞砸的机会包括:
- 自定义查询(使用@Query)可能是错误的(在没有编译时检查的情况下可能会出现各种逻辑错误或拼写错误)
- 从方法名称派生查询的存储库方法可能不是您想要的。
- 传入的参数,参数列表中的类型可能与查询中所需的类型不匹配(编译时没有强制执行)。
在所有这些情况下,您不是在测试 Spring Data JPA,而是在测试使用 Spring Data JPA 实现的功能。
使用提供的方法的案例开箱即用,如findOne、findAll、save等,上面没有你的指纹,不需要测试。
测试这玩意很容易,早发现bug总比晚发现好。