【问题标题】:Does Spring provide stub implementation of JpaRepositories?Spring 是否提供 JpaRepositories 的存根实现?
【发布时间】:2018-09-22 06:05:00
【问题描述】:

我正在尝试对与此类似的服务类进行单元测试:

   @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 来模拟存储库行为,而是希望有一些内存中的实现(在列表或映射上)来模仿数据库行为。

Spring 是否提供了这种虚假的实现?

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

【问题讨论】:

  • 不,它不会...使用Mockito 创建动态模拟。
  • 正如我上面提到的,我不想使用 mockito,我希望 stub 实现来模拟真实的存储。用大量的 doReturn().when() mumbo-jumbo 来维护测试太费力了......
  • 在模拟中包含存根会得到什么?除了调用之外,您没有测试任何东西......如果您有一个糟糕的存根实现,那么您的测试失败不是因为您的服务,而是因为您糟糕的测试实现。如果这是您真正想要使用内存数据库进行测试的内容,并让 Spring Data JPA 创建您的存储库实例。
  • 我想专注于测试我的测试代码中的服务逻辑,我不想有模拟配置行和验证与存储库的交互。当服务正在保存对象时,我希望使用 repository.findAll() 来访问它,而不是使用veryfy(repo).save(...) 验证对象是否保存。
  • 它是 1 行代码......而且你不应该使用相同的机制来存储和验证。当调用save 时,您现在会自动假定findAll 工作正常。除了使用 Mockito 之外,如果你真的想的话,你甚至可以(如果你愿意的话)创建一个通用的存根。

标签: java spring unit-testing spring-data-jpa


【解决方案1】:

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

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() {
  }

}

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

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

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

@ActiveProfiles("test")

【讨论】:

  • 谢谢,我知道在内存数据库中使用测试,我只是在寻找一种快速测试的方法,设置 spring 上下文需要太长时间,我希望在开发时得到即时反馈代码。等待@SpringBootTest 对于快速和良好的反馈循环来说太长了。
【解决方案2】:

No Spring Data 不提供该接口的假实现。

您必须自己创建它或使用像 Mockito 这样的模拟框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多