测试向外部发送请求的端点 api

Test of endpoint that sends a request to external api

有一个小方法 mymethod 可以从外部 api 数据中获取 json 格式的响应,这将是 Dto 和 然后有一个 getEnums 方法选择要留下的数据和 returns 一个字符串列表,结果是 mymethod 本身 returns 一个字符串列表。 我尝试编写测试,但我得到:

预期:200

实际:302

我的理解是重定向的问题,但是我不明白怎么解决,也许你有答案?

控制器

@GetMapping(value = "api/mymethod", produces = "application/json")
    public ResponseEntity<List<String>> mymethod(@RequestHeader(value = "Enum") String Enum,
                                                @RequestParam(value = "Type") String Type) {

        URI uri = UriComponentsBuilder.fromUriString("...url...").build().toUri();

        HttpHeaders headers = new HttpHeaders();

        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.setContentType(MediaType.APPLICATION_JSON);

        HttpEntity<String> entity = new HttpEntity<>(null, headers);

        ResponseEntity<myDto> response =
                restTemplate.exchange(uri, HttpMethod.GET, entity, myDto.class);

        List<String> currencies = 
                getEnums(response, Type); // <- custom method
        return new ResponseEntity<>(currencies, HttpStatus.OK);
}

//(测试没有写全,刚好留下问题区域)

测试

  @Test
    public void mytest() throws Exception{

        ResultActions getResult = mockMvc.perform(get("/api/mymethod")
                        .header("Enum", "OOL")
                        .param("Type", "Counter"))
                .andExpect(status().isOk());

    }

针对外部服务进行测试的问题是您无法管理它的状态。因此,即使您没有进行任何更改,您的测试用例也可能会显示不同的结果。

通常您会创建一个模拟您的测试对象将访问的 REST api。然后您可以向您的测试对象发送请求并检查模拟的 api 是否确实收到了预期的请求。您还可以伪造成功或错误响应并检查您的测试对象如何反应。

最后回答您的问题:您希望您的客户如何处理重定向?它应该跟随还是出错?查看状态 302 的含义,它意味着资源已临时移动或至少在新位置找到。如果服务器正在尝试负载平衡或试图指出离您更近的 url network-wise,这可能意味着有效的重定向。因此我认为客户应该遵循 302.