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

4

我创建了一个构建器类,用于构建 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 处理。当然,这只是我的个人意见。 - Essex Boy
我有10个参数,它们可以是空的或者为null。我不能写10!个单独的规范。 - ByeBye
1个回答

7
  1. 如果必须测试与数据库交互的实际代码,请使用DBUnit简化您的生活,建议您使用HSQLDB,这样您的测试就可以在运行时设置其环境,而不需要已经安装和配置了数据库。

    在集成测试中,您可以检查查询是否正确、可执行、返回预期结果、数据模型是否有效...... 您不需要在集成测试中检查所有可能的组合,只需检查正确执行和结果是否如预期。

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

因此,如果您想“仅测试逻辑,如何创建OR和AND子句”,则可以使用模拟来检查创建方式,但是您应该至少有一个方法的集成测试:Specification build(),其中包含最多数量的标准,例如appendOr,appendAnd....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接