如何为 spring 规范编写单元测试?

Bye*_*Bye 2 java testing spring unit-testing spring-data-jpa

我创建了一个构建规范对象的构建器类。它用于为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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,在 spring API 中我找不到任何有帮助的方法

xyz*_*xyz 6

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

  2. 如果您不必与数据库交谈(appendOr,appendAnd - 您检查行为,而不是数据。检查规范构建器是否具有预期行为 - 应用 AND ,OR ..... 谓词),请使用通用模拟库:EasyMock ,Mockito 或任何其他,并使测试不真正与 DB 对话,这通常会使测试更快更简单。

因此,如果您只想“测试逻辑,OR 和 AND 子句是如何创建的”,您可以使用模拟来检查创建方式,但是您应该至少对方法进行一个集成测试:规范 build() 具有最大数量的标准,例如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

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