我有以下方法:
public < V extends U > boolean matchesObject (V object, String filter) {
if (filterIsAny(filter)) return true;
else {
List<T> targets = getFilterTarget(object);
for (T t : targets) if (matches(t, filter)) return true;
return false;
}
}
其中filterIsAny(filter)是一个简单的方法(只需检查filter!= null)。
我的问题是:在进行单元测试时,是否值得模拟此方法,以便确保我的函数遵循函数中的正确路径,或者我只是假设我的filterIsAny(filter)可以工作并使用真实方法进行测试?在这种特殊情况下,模拟此方法非常容易,但是在其他实例中,将需要几行代码来模拟琐碎函数返回的中间结果,例如模拟对象列表中的list.indexOf(object)
我知道这不是“纯粹的”单元测试,因为从理论上讲我一次将测试多个功能,但是当进行更多的工作而不是查找错误时,进行纯单元测试是值得的吗?测试失败时的代码?
答案 0 :(得分:1)
假设filterIsAny
起作用直到获得非平凡的逻辑。
如果您的函数是一个没有逻辑分支的纯Java语句的包装,则可以安全地跳过为其编写单元测试的过程,因此可以跳过其他单元测试中的编写。您要 要测试的是假设要测试的方法具有非平凡的逻辑,就是该方法中的各个分支。
在这里,您将设置过滤器对象,以便在根据要测试的逻辑分支测试true
时,它会产生false
和matchesObject(V object, String filter)
结果(集合中不匹配) ,集合中的一个匹配项,无效的集合类型(如果可能),空输入等)
在您的情况下,由于此后您执行了一条简单的语句filterIsAny(filter)
,因此可以跳过对真实分支进行评估的return true
。
顺便说一句,如果可能,请考虑重构为Stream.anyMatch()
;它将减少函数中return语句的数量并增强可读性。