Spring 是否提供 JpaRepositories 的存根实现?

Tom*_*wor 5 java spring unit-testing spring-data-jpa

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

   @Service
   public class SomeQueryService {

    private final SomeRepository repository;

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

    public void doSomething() {
        // code doing some magic
    }
}
Run Code Online (Sandbox Code Playgroud)

SomeRepository是简单的存储库接口扩展JpaRepository接口。

我想做的是对该服务进行单元测试以验证它是否正常工作。

我不想使用mockito来模拟存储库行为,我想要一些内存中的实现(在列表或地图上)来模仿数据库行为。

Spring提供了这样的假实现吗?

我想避免自己对此类存储库进行存根实现,因为我将在许多其他地方使用此类测试。

sas*_*_bg 0

您所指的测试类型称为“集成测试”或“端到端测试”,因为与仅测试一种方法的单元测试相比,它测试整个应用程序或其中的很大一部分。

https://www.guru99.com/unit-test-vs-integration-test.html

您不应该对您的存储库进行单元测试,因为它们已经经过 Spring 团队的充分测试。

解决方案:

您可以创建一个使用 Spring Boot 启动整个 spring 容器的测试:

只需在测试文件夹中创建一个类并用以下注释对其进行注释:

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

  @Test
     public void test() {
  }

}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 H2 配置嵌入式数据库,以便您的测试不使用生产数据库,只需遵循 Spring Boot 数据库初始化文档即可。

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

附言。您还可以在测试类上使用以下注释创建特定的配置文件:

@ActiveProfiles("test")

  • 谢谢,我知道在内存数据库中使用测试,我只是在寻找一种快速测试的方法,设置 spring 上下文需要太长时间,我希望在开发代码时得到即时反馈。等待 @SpringBootTest 需要太长的时间才能获得快速而良好的反馈循环。 (2认同)