我有这种方法需要测试。
protected RestResponseStatus validate(INotificationValidator... validations) {
RestResponseStatus resp = null;
for (INotificationValidator validation : validations) {
if (!validation.isValid()) { // <- need to test this
resp = validation.createErrorResponseStatus();
break;
}
}
return resp;
}
为了测试它,我创建了类并使用此方法用类扩展它并创建测试方法
@Test
public void nonValidBranchTest() {
ParameterValidator validator = createMock(ParameterValidator.class);
validator.isValid();
expectLastCall().andReturn(false);
replay(validator);
this.validate(new ParameterValidator(TEST_STRING));
verify(validator);
}
但是当我尝试进行测试时 - 我发现了错误
java.lang.AssertionError:
Expectation failure on verify:
ParameterValidator.isValid(): expected: 1, actual: 0
答案 0 :(得分:1)
为什么不将验证器模拟传递给validate方法?
ParameterValidator validator = createMock(ParameterValidator.class);
validator.isValid();
expectLastCall().andReturn(false);
replay(validator);
this.validate(validator);
verify(validator);
如果你创建一个新的ParameterValidator
实例,那么模拟当然永远不会被调用。
据我所知......你想测试validate
方法是否在验证器上调用isValid
,如果它返回false
,则调用validation.createErrorResponseStatus
。
因此,您还应记录该行为
RestResponseStatus expectedRespStatus = createMock(RestResponseStatus.class);
ParameterValidator validator = createMock(ParameterValidator.class);
validator.isValid();
expectLastCall().andReturn(false);
validator.createErrorResponseStatus().andReturn(expectedRespStatus);
expectLastCall();
replay(validator);
replay(expectedRespStatus);
RestResponseStatus respStatus = this.validate(validator);
assertSame(expectedRespStatus, respStatus);
verify(validator);
答案 1 :(得分:0)
您应该在测试类中创建要测试的对象实例,而不是扩展它。测试类通常不会扩展被测试的类,而是镜像src \ main \ test下的包结构,以便您可以访问受保护的方法。
有0个电话的原因是您拨打的电话为this.validate
MyClassTest
,而不是MyClass