如何使用泛型类型模拟 ResponseEntity<?> ?

Sti*_*ive 8 java junit web-services mockito spring-boot

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

需要mock的方法:

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
    }

  }
Run Code Online (Sandbox Code Playgroud)

在我的模拟方法中:

when(restC.SomeMethod(client)).thenReturn(resp);
Run Code Online (Sandbox Code Playgroud)

因此,上述方法调用服务获取一些数据,获取expressView的值并将其保存为列表。当我模拟该方法时,when(restC.SomeMethod(client)).thenReturn(resp);它命中了 URL,但我得到的响应值resp是 null 。所以我在这里得到的resp值为null。我检查了邮递员中的 URL(someUrl) 它返回的值。

如何嘲笑ResponseEntity<?>

谢谢。

Jul*_*edo 16

首先,创建一个ResponseEntity对象:

HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);

ResponseEntity<?> responseEntity = new ResponseEntity<>(
    "some response body",
    header, 
    HttpStatus.OK
);
Run Code Online (Sandbox Code Playgroud)

然后构建一个模拟来返回responseEntity对象:

when(restC.SomeMethod(client)).thenReturn(responseEntity);
Run Code Online (Sandbox Code Playgroud)

注意点:

ResponseEntity避免在室内使用@Service class。你应该使用ResponseEntity@RestController class.

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

@RestController
public class YourControllerClass {

    @Autowired
    private YourServiceClass yourServiceClass;
Run Code Online (Sandbox Code Playgroud)

或者使用 constructor ,例如:

@RestController
public class YourControllerClass {

    private YourServiceClass yourServiceClass;

    public YourControllerClass(YourServiceClass yourServiceClass) {
        this.yourServiceClass= yourServiceClass;
    }
Run Code Online (Sandbox Code Playgroud)

所以:

@Service class将处理business or data objects并将@RestController class处理ResponseRequest对象。这样我们就有Single Responsibility原则了。


一些不错的链接:

希望这可以帮助!