如何编写弹簧规格的单元测试?

时间:2017-06-21 09:18:52

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

我创建了一个构造Specifications对象的构建器类。它用于为JpaSpecificationExecutor创建查询。使用构建器,因为我有许多参数可以为null / empty(来自用户进行过滤),如果没有它,我就不能只使用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中我找不到任何有用的方法

1 个答案:

答案 0 :(得分:2)

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

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

  3. 因此,如果您只想测试逻辑,那么如何创建OR和AND子句&#39;您可以使用mock来检查创建方式,但是您应该对方法进行最小化集成测试:使用appendOr,appendAnd等最大标准量的规范build()

    仅举例来说:例如,spring-data如何测试代码:

    使用mock进行单元测试: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

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