【发布时间】:2019-01-10 15:02:04
【问题描述】:
我的服务中有以下功能。
public boolean checkNameUnique(String name) {
QEntity qEntity = QEntity.entity;
BooleanExpression nameUniquePredicate = qEntity.name.eq(name);
long count = entityReadRepository.count(nameUniquePredicate);
return count == 0;
}
它只是检查名称是否已经存在于数据库中。这需要是唯一的,因此如果不存在则返回 true,如果存在则返回 false。
现在我该如何为此编写一个模拟单元测试用例?我是 Mockito 和编写单元测试用例的新手,因此是这个问题。
我对 Mockito 的阅读使我写了一些关于
when(entityReadRepository.count(nameUniquePredicate)).thenReturn(1);
然后调用要测试的函数。但这没有任何意义。
Entity 是 Hibernate 实体,对应于 DB 中的一个表
entityReadRepository 扩展了 JpaRepository 和 QueryDslPredicateExecutor。 QEntity 是QueryDsl 的插件生成的Q 对象。
【问题讨论】:
-
我正在考虑是否可以模拟将对象插入到 repo 中,然后 checkNameUnique 会自动选择存在的某某对象。
-
“但这没有任何意义”你为什么这么说?你的模拟代码对我来说是正确的。如果这是一个单元测试,你不应该测试你的持久层,你不应该测试你的数据库层是否在做它应该做的事情。
-
我这么说是因为我只是重写了返回 1 的语句。这是测试该代码的有效方法吗?还是这个函数非常简单并且依赖于数据库,以至于模拟单元测试用例在这里没有意义?
-
另外,我正在寻找一些解决方案,我可以说在模拟仓库中插入一个模拟对象,然后当我调用该函数时,它应该搜索模拟仓库并给出答案?这在 mockito 中是否可行?
-
在阅读更多内容后,我看到人们使用实体管理器并尝试这样做。但这对我不起作用。我没有使用任何实体管理器。将其全部抽象为 querydsl 和 jparepository 扩展
标签: spring hibernate jpa mockito querydsl