如何模拟在另一个方法中设置的本地对象 属性
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));
这模拟了验证响应的值 属性。
我的应用程序中有类似下面的代码。
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));
这模拟了验证响应的值 属性。