我应该隔离多少单元测试方法?

时间:2019-07-11 09:07:05

标签: java unit-testing testing junit mocking

我有以下方法:

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)

我知道这不是“纯粹的”单元测试,因为从理论上讲我一次将测试多个功能,但是当进行更多的工作而不是查找错误时,进行纯单元测试是值得的吗?测试失败时的代码?

1 个答案:

答案 0 :(得分:1)

假设filterIsAny起作用直到获得非平凡的逻辑。

如果您的函数是一个没有逻辑分支的纯Java语句的包装,则可以安全地跳过为其编写单元测试的过程,因此可以跳过其他单元测试中的编写。您要 要测试的是假设要测试的方法具有非平凡的逻辑,就是该方法中的各个分支。

在这里,您将设置过滤器对象,以便在根据要测试的逻辑分支测试true时,它会产生falsematchesObject(V object, String filter)结果(集合中不匹配) ,集合中的一个匹配项,无效的集合类型(如果可能),空输入等)

在您的情况下,由于此后您执行了一条简单的语句filterIsAny(filter),因此可以跳过对真实分支进行评估的return true

顺便说一句,如果可能,请考虑重构为Stream.anyMatch();它将减少函数中return语句的数量并增强可读性。