如何模拟在另一个方法中设置的本地对象 属性

How to mock local object property which is been set in another method

我的应用程序中有类似下面的代码。

public String someMethod(final Object obj) {
    final ValidationResponse validationResponse = new ValidationResponse();
    String responseMessage = validatorService.validate(obj, validationResponse);
    if(validationResponse.isValid()) {
        //Positive flow
    }
    else {
        //Negative flow
    }
    return responseMessage;
}

我正在编写 JUnit 测试用例来生成 Mutation 的报告。由于使用了对象 validationResponse,它是在流程中创建的本地对象。 Mockito 无法获得 return isValid 所需的值。因此,我无法涵盖 Positive flow.

的测试用例

这是如何实现的?非常感谢任何线索。

该方法的流程由这一行决定

 String response = validator1.validate(obj, validationResponse);

如果您想执行以下 if 语句的两个分支,您需要控制 validator1 对 validationResponse 对象所做的修改。

这可以通过两种方式完成。

如果您的测试可以注入 validator1 的实例(例如通过测试构造函数下的代码),那么您可以伪造它。

这可能是使用手工编码实现而不是模拟框架最简单的方法。

例如

class AlwaysInvalid implements WhateverTheTypeOfValidator1Is {
    void validate(Object unused, ValidationResponse response) {
       response.setInvalidOrWhatever();
    }
}

或者,您可以使用真正的协作者,在这种情况下,您的测试需要确保将对象传递到 someMethod,从而导致有效和无效的响应。

我从我的一位队友那里得到了这个问题的解决方案。如下

Mockito.doNothing(invocation ->
{
    ValidationResponse validationResponse = invocation.getArgument(0);
    validationResponse.setValida(true);//Set value true or false based on the mock test case scenario.
    return null;
})
.when(validatorService)
.validate(obj, validationResponse));

这模拟了验证响应的值 属性。