我需要模拟服务。 我在嘲笑班级时ResponseEntity<?>
resp 中得到 null。
需要模拟的方法:
public List<Expression> getExpression(String expressView, Localdate date) {
List<Expression> =new ArrayList<>();
Map<String, Object> uri = new HashMap<>();
UriComponenetsBuilder build =
UriComponentsBuilder.fromHttpUrl("someUrl" + "/" + expressView);
build.queryParam(someParameter, someParameter);
build.queryParam(someParameter, someParameter);
build.queryParam(someParameter, someParameter);
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
RestClient client = new RestClient(
build.build().encode.toUriString, HttpMethod.GET.Uri, header
);
ResponseEntity<?> resp = restC.SomeMethod(client);
if (resp = !null) {
//it goes to these line
}
}
在我的模拟方法中:
when(restC.SomeMethod(client)).thenReturn(resp);
所以上面的方法调用一个服务获取一些数据获取 expressView 的值并另存为列表。 当我嘲笑该方法时when(restC.SomeMethod(client)).thenReturn(resp);
它命中了 URL,但我作为响应resp
得到的值为 null . 所以在这里我得到resp
值为null
.我在邮递员中检查了URL(someUrl(,它返回了值。
如何嘲笑ResponseEntity<?>
?
谢谢。
首先,创建一个ResponseEntity
对象:
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
ResponseEntity<?> responseEntity = new ResponseEntity<>(
"some response body",
header,
HttpStatus.OK
);
然后构建一个模拟来返回responseEntity
对象:
when(restC.SomeMethod(client)).thenReturn(responseEntity);
注意事项:
避免在
@Service class
内使用ResponseEntity
。您应该在@RestController class
中使用ResponseEntity
。
您可以使用@Autowired
注释Inject
@Service class
,例如:
@RestController
public class YourControllerClass {
@Autowired
private YourServiceClass yourServiceClass;
或者使用constructor
,例如:
@RestController
public class YourControllerClass {
private YourServiceClass yourServiceClass;
public YourControllerClass(YourServiceClass yourServiceClass) {
this.yourServiceClass= yourServiceClass;
}
所以:
@Service class
将处理business or data objects
,@RestController class
将处理Response
和Request
对象。因此,我们有了Single Responsibility
原则。
一些不错的链接:
- Spring MVC - 使用 RequestEntity 和 ResponseEntity
- 如何模拟 REST 模板
- 使用 Spring 构建 REST 服务
- 了解单一责任原则
希望这有帮助!