Получение ошибки при тестировании пружинного контроллера Asyn c - PullRequest
0 голосов
/ 11 февраля 2020

Контроллер

    @PostMapping("/endpoint/group/move")
    public DeferredResult<ResponseEntity<List<Endpoint>>> moveEndpointGroup(@RequestBody List<String> EndpointIds,
            @RequestParam("from") String fromGroupId, @RequestParam("to") String toGroupId)
            throws ResourceNotFoundException, ExecutionException {
        DeferredResult<ResponseEntity<List<Endpoint>>> result = new DeferredResult<>();
        if (EndpointIds != null && !EndpointIds.isEmpty()) {
            CompletableFuture.supplyAsync(() -> EndpointService.moveEndpoints(EndpointIds, fromGroupId, toGroupId), executor)
                    .whenComplete((movedEndpointsList, ex) -> {
                        if (ex != null) {
                            throw new RuntimeException(ex);
                        }
                        if (movedEndpointsList.size() == EndpointIds.size()) {
                            result.setResult(ResponseEntity.status(HttpStatus.OK).body(movedEndpointsList));
                        } else {
                            result.setResult(ResponseEntity.status(HttpStatus.PARTIAL_CONTENT).body(movedEndpointsList));
                        }
                    });
        }
        return result;
    }

Я написал следующий метод тестирования, он не работает. Когда я запускаю этот тест, я получаю Asyn c результат для обработчика не был установлен в течение указанного времениToWait.

Может кто-нибудь помочь мне, где я делаю неправильно?

    @Test
    public void testMoveEndpointGroup_WhenSuccess() throws Exception {

        List<Endpoint> EndpointList = Arrays.asList(Endpoint, Endpoint);

        List<String> EndpointIds = Arrays.asList("123");

        Mockito.when(EndpointService.moveEndpoints(Mockito.any(), Mockito.anyString(), Mockito.anyString()))
                .thenReturn(EndpointList);

        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/endpoint/group/move")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(EndpointIds)).param("from", "gorupA").param("to", "groupB");

        MvcResult result = mvc.perform(requestBuilder).andReturn();

        result = mvc.perform(MockMvcRequestBuilders.asyncDispatch(result)).andDo(MockMvcResultHandlers.print()).andReturn();


        JsonNode actual = objectMapper.readTree(result.getResponse().getContentAsString()).get("content");

        String expected = objectMapper.writeValueAsString(Arrays.asList(EndpointList));

        Assert.assertEquals(expected, actual.toString());

    }

1 Ответ

0 голосов
/ 11 февраля 2020

1) У вас есть контроллер с URL

@PostMapping("/endpoint/group/move")

Но в тесте вы отправляете запрос в '/ Endpoint s / group / move' (дополнительные s)

post("/Endpoints/group/move")

2) И вам не нужно '.get ("content")', так как вы уже проанализировали тело ответа. Также выглядит, что вам не нужно анализировать ответ на JsonNode, просто используйте String

String actual = result.getResponse().getContentAsString();
String expected = objectMapper.writeValueAsString(Arrays.asList(EndpointList));
Assert.assertEquals(expected, actual.toString());
...