单元测试-如果测试方法过早失败,该如何模拟?

时间:2018-10-03 07:44:45

标签: java spring unit-testing

假设我们有以下简单的示例代码:

public void doXYZ(UUID uuidA, UUID uuidB, UUID uuidC){

ObjectA objectA = objectAService.read(uuidA);

ObjectB objectB = objectBService.read(uuidB);

    if(!doMatch(objectA, objectB)){
        throw new ObjectsDoNotMatchException(objectA);
    }

    ObjectC objectC = objectCService.read(uuidC);
    objectC.setObjects(objectA, objectB);

    objectJobService.doWork(objectC);

}

将会有一个测试用例,它测试并期望由于某些匹配问题而引发异常。

问题:模拟前两个服务+ objectValidationService是否足够,因为如果测试用例可行,则所有其他服务都无法访问?还是应该模拟objectCService以及objectJobService,因为它们可能会被调用,并且如果测试无法按预期进行,则返回NullPointerException?

我经常问这样的问题,这些方法是否不如所示方法那么琐碎,而是具有多个其他依赖关系,应该对其进行模拟,因为要为完整路径生成有效状态可能是很多工作(不在早期测试中)。

编辑:让我们更具体一些。如果应该对它们进行嘲笑:是否不指定返回值(例如使用when())并让它们失败就足够了吗?或者那些被嘲笑且通常不需要的服务也应该返回有效值?

1 个答案:

答案 0 :(得分:0)

是:应该嘲笑所有服务。

您要确保当对象A和对象B不匹配时,与objectCServiceobjectJobService没有交互。