【问题标题】:Unit tests - What to Mock if tested method fails early?单元测试 - 如果测试方法提前失败,要模拟什么?
【发布时间】:2018-10-03 07:44:44
【问题描述】:

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

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);

}

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

问题:Mock 前两个服务 + objectValidationService 是否足够,因为如果测试用例有效,则无论如何都无法访问所有其他服务?还是应该模拟 objectCService 和 objectJobService ,因为如果测试没有按预期工作,它们可以被调用并返回 NullPointerException ?

我经常问这种问题,如果这些方法不像所示的方法那么简单,而是有多个进一步的依赖关系,应该模拟这些依赖关系,因为要为完整路径生成有效状态可能需要做很多工作(即未在此测试用例中测试)用于早期故障用例。

编辑:让我们更具体一些。如果它们应该被模拟:不指定返回值(例如使用 when())并让它们失败就足够了,还是那些被模拟且通常不需要的服务也返回有效值?

【问题讨论】:

    标签: java spring unit-testing


    【解决方案1】:

    是的:所有服务都应该被模拟。

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

    【讨论】:

    • 让我们更具体一些。如果它们应该被模拟:不指定返回值(例如使用 when())并让它们失败就足够了吗,或者那些被模拟且通常不需要的服务也应该返回有效值?
    • Mockito 的做法:verifyZeroInteractions(objectCService, objectJobService);
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多