首页 > 解决方案 > 如何使用泛型模拟 ResponseEntity?

问题描述

我需要模拟一项服务。ResponseEntity<?>我在嘲笑班级时得到了空值。

需要模拟的方法:

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<?>

谢谢。

标签: javaweb-servicesspring-bootjunitmockito

解决方案


首先,创建一个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);

注意点:

避免在ResponseEntity里面使用@Service class。你应该ResponseEntity@RestController class.

您可以Inject使用@Service class注释@Autowired,例如:

@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处理ResponseRequest对象。这样我们就有了Single Responsibility原则。


一些不错的链接:

希望这可以帮助!


推荐阅读