spring - 如何对 jpa 存储库方法进行单元测试?

标签 spring unit-testing jpa repository junit4

我编写了一个 JPA 存储库方法,现在我意识到它是 无法进行单元测试 .

任何人都可以请指教如何对以下方法进行单元测试 如何重构我的存储库 所以它是单元可测试的?

这是有问题的方法:

@Override
public List<Pli> findPlisByMultiField(String identifiant, Date dateReceptionFrom, Date dateReceptionTo, PaiementEnum paiement, AREnum ar, String numeroAR, FDVEnum FDV, ConteneurNum conteneurNum, StatutPli statut) {
    log.debug("findPlisByMultiField");

    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Pli> c = criteriaBuilder.createQuery(Pli.class);
    Root<Pli> pli = c.from(Pli.class);

    List<Predicate> criteria = new ArrayList<Predicate>();

    if (identifiant != null && !identifiant.trim().equals("")) {
        ParameterExpression<String> parameterIdentifiant = criteriaBuilder.parameter(String.class, "identifiant");
        Predicate conditionIdentifiant = criteriaBuilder.like(pli.<String> get("identifiant"), parameterIdentifiant);
        criteria.add(conditionIdentifiant);
    }

    if (dateReceptionFrom != null && dateReceptionTo != null) {
        ParameterExpression<Date> parameterDateReceptionFrom = criteriaBuilder.parameter(Date.class, "dateReceptionFrom");
        ParameterExpression<Date> parameterDateReceptionTo = criteriaBuilder.parameter(Date.class, "dateReceptionTo");
        Predicate conditionDateReception = criteriaBuilder.between(pli.<Date> get("dateReception"), parameterDateReceptionFrom, parameterDateReceptionTo);
        criteria.add(conditionDateReception);
    }

    if (paiement != null) {
        if (paiement.equals(PaiementEnum.IsPaiement)) {
            Predicate conditionPaiementEnum = criteriaBuilder.equal(pli.<PaiementEnum> get("paiement"), true);
            criteria.add(conditionPaiementEnum);
        } else {
            Predicate conditionPaiementEnum = criteriaBuilder.equal(pli.<PaiementEnum> get("paiement"), false);
            criteria.add(conditionPaiementEnum);
        }
    }

    if (ar != null) {
        if (ar.equals(AREnum.IsAR)) {
            Predicate conditionAREnum = criteriaBuilder.equal(pli.<AREnum> get("AR"), true);
            criteria.add(conditionAREnum);
        } else {
            Predicate conditionAREnum = criteriaBuilder.equal(pli.<AREnum> get("AR"), false);
            criteria.add(conditionAREnum);
        }
    }

    if (numeroAR != null && !numeroAR.trim().equals("")) {
        ParameterExpression<String> parameterNumeroAR = criteriaBuilder.parameter(String.class, "numeroAR");
        Predicate conditionNumeroAR = criteriaBuilder.like(pli.<String> get("numeroAR"), parameterNumeroAR);
        criteria.add(conditionNumeroAR);
    }

    if (FDV != null) {
        if (FDV.equals(FDVEnum.IsFDV)) {
            Predicate conditionFDVEnum = criteriaBuilder.equal(pli.<FDVEnum> get("FDV"), true);
            criteria.add(conditionFDVEnum);
        } else {
            Predicate conditionFDVEnum = criteriaBuilder.equal(pli.<FDVEnum> get("FDV"), false);
            criteria.add(conditionFDVEnum);
        }
    }

    if (conteneurNum != null) {
        ParameterExpression<ConteneurNum> parameterConteneurNum = criteriaBuilder.parameter(ConteneurNum.class, "conteneurNum");
        Predicate conditionConteneurNum = criteriaBuilder.equal(pli.<ConteneurNum> get("conteneurNum"), parameterConteneurNum);
        criteria.add(conditionConteneurNum);
    }

    if (statut != null) {
        ParameterExpression<StatutPli> parameterStatut = criteriaBuilder.parameter(StatutPli.class, "statut");
        Predicate conditionStatut = criteriaBuilder.equal(pli.<StatutPli> get("statut"), parameterStatut);
        criteria.add(conditionStatut);
    }

    if (criteria.size() == 0) {
        return Pli.findAllPlis();
    } else if (criteria.size() == 1) {
        c.where(criteria.get(0));
    } else {
        c.where(criteriaBuilder.and(criteria.toArray(new Predicate[0])));
    }

    TypedQuery<Pli> q = em.createQuery(c);
    if (identifiant != null && !identifiant.trim().equals("")) {
        q.setParameter("identifiant", "%" + identifiant + "%");
    }
    if (dateReceptionFrom != null && dateReceptionTo != null) {
        q.setParameter("dateReceptionFrom", dateReceptionFrom);
        q.setParameter("dateReceptionTo", dateReceptionTo);
    }

    if (numeroAR != null && !numeroAR.trim().equals("")) {
        q.setParameter("numeroAR", "%" + numeroAR + "%");
    }

    if (conteneurNum != null) {
        q.setParameter("conteneurNum", conteneurNum);
    }

    if (statut != null) {
        q.setParameter("statut", statut);
    }

    return q.getResultList();
}

最佳答案

好吧,我认为您无法对其进行单元测试,因为它是严格指定的,但是您可以使用内存数据库(注意 HSQL)进行测试,这样应用程序就不需要实际转到真正的数据库只是为了测试。

这样,您将能够创建一个可以在 JUnit 中运行的自动化测试,例如,模拟可能只是其中的一些方法。

关于spring - 如何对 jpa 存储库方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11717364/

相关文章:

java - 使用 hibernate 从 DTO 更新实体会删除其他字段

java - jax-ws 服务返回数组列表

java - BasicDataSource 无法解析为类型

java - 如何显示包含对象 HashMap 的模型的值?

python - python-3.3 的模拟工具

python - 单元测试 get_absolute_url django

jpa - EclipseLink 和 Oracle DB 出现时区错误

Hibernate - 使用编程事务惯用语的 CMT EJB

java - Spring TransactionTemplate 是否创建线程?

c# - 需要 OAuth token 的单元测试 API