spring-data-jpa Spring是否提供JpaRepositories的存根实现?

vfhzx4xs  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(114)

我正在尝试对我的服务类进行单元测试,它看起来类似于:

@Service
   public class SomeQueryService {

    private final SomeRepository repository;

    public SomeQueryService(SomeRepository repository) {
        this.repository = repository;
    }

    public void doSomething() {
        // code doing some magic
    }
}

SomeRepository是扩展JpaRepository接口简单存储库接口
我要做的是对此服务进行单元测试,以验证它是否工作正常。
我不想使用mockito来模拟存储库行为,而是希望有一些内存中的实现(在列表或Map上)来模拟数据库行为。

Spring是否提供此类伪实现?

我希望避免自己对这样的存储库进行存根实现,因为我将在许多其他地方使用这样的测试。

qvtsj1bj

qvtsj1bj1#

RealLifeDeveloper已经创建了一个MIT许可的helper-class来完成您想要的任务:用一个plain-old-java-object来实现repository-interface,这个对象只是 Package 了一个Collection,并将其命名为“InMemoryJpaRepository”。您仍然需要自己实现一些逻辑1,不过如果您的查询不是太复杂的话,这应该很容易。
下面是一篇解释如何做到这一点的文章,其中包含以下示例:https://reallifedeveloper.com/creating-in-memory-versions-of-spring-data-jpa-repositories-for-testing/
这个仓库(也包括其他东西)在github上:https://github.com/reallifedeveloper/rld-build-tool
如果您不需要整个存储库,可以在https://github.com/reallifedeveloper/rld-build-tools/tree/master/src/main/java/com/reallifedeveloper/tools/test/database/inmemory中找到用于创建inmemory-db的特定帮助文件。
[1]“不要在测试中使用逻辑”这条规则的存在是有原因的,但它显然违反了这条规则。然而,其他答案中提到的广为人知的、被广泛使用的替代方法,H2测试和广泛的嘲弄,也有它们的缺点。

1yjd4xko

1yjd4xko2#

您所指的测试类型称为“集成测试”或“端到端测试”,因为它测试整个应用程序或其中的一大块,而单元测试只测试一个方法。
https://www.guru99.com/unit-test-vs-integration-test.html
您不应该对存储库进行单元测试,因为它们已经被spring团队很好地测试过了。

解决方案:

您可以使用Sping Boot 创建一个启动整个Spring容器的测试:
只需在您的测试文件夹中创建一个类,并使用以下内容对其进行注解:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTestClass {

  @Test
     public void test() {
  }

}

然后,您可以使用H2配置嵌入式数据库,以便您的测试不使用生产数据库,只需遵循Sping Boot Database Initialization文档即可。
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
PS.你也可以在你的测试类上使用下面的注解来创建一个特定的概要文件:
@ActiveProfiles("test")

mrphzbgm

mrphzbgm3#

NotSpringData不提供该接口的伪实现。
您必须自己创建它,或者使用Mockito这样的模拟框架。

相关问题