【问题标题】:How to write a unit test for spring specification?如何为 Spring 规范编写单元测试?
【发布时间】:2017-06-21 09:18:52
【问题描述】:

我创建了一个构建器类来构造Specifications 对象。它用于为JpaSpecificationExecutor 创建查询。使用了构建器,因为我有许多参数可以为空/空(来自用户用于过滤),没有它我不能只使用Specifications

public class SpecificationBuilder<T> {

    private Specifications<T> specification;

    public SpecificationBuilder() {

    }

    public SpecificationBuilder(final Specification<T> spec) {
        specification = Specifications.where(spec);
    }

    public SpecificationBuilder<T> appendOr(final Specification<T> spec) {
        specification = Specifications.where(spec).or(specification);
        return this;
    }

    public SpecificationBuilder<T> appendAnd(final Specification<T> spec) {
        specification = Specifications.where(spec).and(specification);
        return this;
    }

    public Specification<T> build() {
        return Specifications.where(specification);
    }

}

我的问题是我不知道如何单独测试它。当然,我可以自动装配真实存储库(在内存数据库上),但我不想为此涉及任何其他类,并且只测试逻辑,即 OR 和 AND 子句的创建方式。

不幸的是,在 Spring API 中我找不到任何有用的方法

【问题讨论】:

  • 我不会这样做,我的意思是写一个通用规范,我认为它重写了 JPA 背后的意图。我只会写特定的规范,大多数情况都可以由 Spring JPA 处理。当然只是我个人的看法。
  • 我有 10 个参数可以为空/空。我不能写10!单一规格

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


【解决方案1】:
  1. 如果您必须测试与 DB 对话的实际代码,请使用 DBUnit 让您的生活更轻松,并且建议您使用 HSQLDB,以便您的测试能够在运行时设置它们的环境,而无需需要已经安装和配置的数据库。 在集成测试中,您检查查询是否正确、可执行、返回预期结果、数据模型有效……您无需检查集成测试中所有可能的组合,只需检查正确的执行和预期的结果。

  2. 1234563一个通用的模拟库:EasyMock、Mockito 或任何其他库,并使测试不真正与数据库对话,这通常会使测试更快、更简单。

所以,如果您想“仅测试逻辑,如何创建 OR 和 AND 子句”,您可以使用 mock 来检查创建方式,但您应该对方法进行最少一个集成测试:Specification build() with maximum amount像 appendOr , appendAnd ...这样的标准。

举例:这里是 spring-data 如何测试代码的例子:

使用模拟的单元测试:https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/query/SimpleJpaQueryUnitTests.java

和 集成测试: https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreatorIntegrationTests.java

有两种类型的测试和乳清专用于不同的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2014-02-26
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2020-12-02
    相关资源
    最近更新 更多