问题描述
如何测试具有 storeInDb()
方法并返回数据库模型和 httpstatus.OK
和 httpstatus.Bad_Request
以及正文的服务类。
public ResponseEntity storeInDb(ExeEntity model) {
Validator validation = new Validator();
Map objValidate = validation.validateInput(model.getLink(),model.getUsername(),model.getpassword(),model.getSolution(),model.getDomain());
if (objValidate.containsKey("Success")) {
return new ResponseEntity(model,HttpStatus.OK);
}
else if (objValidate.containsKey("Fail")) {
if (objValidate.containsValue("Invalid Credentials")) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid Credentials");
} }
else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Domain does not exist.");
}
}
请帮助我回答这个问题并编写测试用例。提前致谢。
解决方法
以您当前的代码设计,单元测试真的很难。
您方法的完整逻辑基于 ExeEntityValidator
的结果。换句话说,它依赖于它。这种依赖应该在单元测试中被嘲笑。
为了模拟这个验证器,你应该应用依赖注入。这意味着您提供依赖项,而不是在需要的地方自己创建它。这是通过将依赖项传递给类的构造函数并将其存储为成员变量来完成的。
如果您这样做,您的测试代码可能如下所示:
void test(){
// mock a ExeEntityValidator that is used inside your '::storeInDb' method
Map<String,Object> objValidated = Map.of("Success",true);
var validator = mock(ExeEntityValidator);
doReturn(objValidated).when(validator).validateInput(any(ExeEntity.class));
// instantiate your component with the mocked ExeEntityValidator
var cut = new UnknownClass(validator);
var model = new ExeEntity(...);
// call the method you want to test
var response = cut.storeInDb(model);
assertEquals(HttpStatus.OK,response.getStatusCode());
}