.Метод getBody() не возвращает ответ — SpringBoot, Java

#java #spring-boot #resttemplate

Вопрос:

HttpDataClient.java класс отправляет dataId во внешнюю службу и должен получить что-то в ответ. Для моего теста я должен проверить эту табличку и проверить, получаю ли я хороший ответ.

 public class HttpDataClient implements DataClient{
    
        private final static Logger LOGGER = LoggerFactory.getLogger(HttpDataClient.class);
    
        private final RestTemplate restTemplate;
        private final ObjectMapper objectMapper = new ObjectMapper();
    
        public HttpDataClient(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        @Override
        public DataResponse getData(String dataId) {
            try{
                JsonNode node = restTemplate.exchange(
                        String.format("/data/{0}", dataId),
                        HttpMethod.POST,
                        new HttpEntity<>(buildRequest(dataId), headers()),
                        JsonNode.class
                ).getBody();
                return dataResponse(node);
            }catch (HttpStatusCodeException e) {
                String msg = String.format(
                        "Error getting data for dataId: {0}",
                        dataId,
                        e.getStatusCode(),
                        e.getResponseBodyAsString());
                LOGGER.error(msg);
                return dataResponse.failed();
            }
        }
    
        private MultiValueMap<String, String> headers() {
            final LinkedMultiValueMap<String, String> mv = new LinkedMultiValueMap<>();
            mv.set(HttpHeaders.CONTENT_TYPE, "application/json");
            return mv;
        }
    
        private DataResponse dataResponse(JsonNode node) {
            return DataResponse.dataResponse(
                    asString(node, "dataId"),
                    asString(node, "author"),
                    asString(node, "authorDataId"),
                    asString(node, "serverSideDataId")
            );
        }
    
        private JsonNode buildRequest(String dataId) {
            ObjectNode root = objectMapper.createObjectNode();
            root.put("dataId", dataId);
            return root;
        }
    }
 

DataResponse.java

 public class DataResponse {

    public final String dataId;
    public final String author;
    public final String authorDataId;
    public final String serverSideDataId;

    public DataResponse(
            String dataId,
            String author,
            String authorDataId,
            String serverSideDataId) {
        notNull(dataId, "dataId must be set");
        notNull(author, "author must be set");
        notNull(authorDataId, "authorDataId must be set");
        notNull(serverSideDataId, "serverSideDataId must be set");
        this.dataId = dataId;
        this.author = author;
        this.authorDataId = authorDataId;
        this.serverSideDataId = serverSideDataId;
    }

    public static GameDataResponse gameDataResponse(
            String gameId,
            String vendor,
            String vendorGameId,
            String serverSideGameId){
        return new GameDataResponse(
                gameId,
                vendor,
                vendorGameId,
                serverSideGameId);
    }

    //TODO PD-849 - add faild method
    public static GameDataResponse failed() {
        return new GameDataResponse(
                failed().gameId,
                failed().vendor,
                failed().vendorGameId,
                failed().serverSideGameId
        );
    }
}
 

Интерфейс:

 public interface DataService {

    DataResponse getData(String dataId);
}
 

Вот тестовый класс:

 @RunWith(MockitoJUnitRunner.class)
public class HttpDataServiceTest {

    RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
    private final HttpDataService httpDataService = new HttpDataService(restTemplate);

    @Test
    public void getData(){

        ObjectNode responseNode = JsonNodeFactory.instance.objectNode();
        responseNode.put("dataId", "");
        responseNode.put("author", "");
        responseNode.put("authorDataId", "");
        responseNode.put("serverSideDataId", "");

        Mockito
            .when(restTemplate.exchange(
                    ArgumentMatchers.eq("/data/dataIdTest"),
                    ArgumentMatchers.eq(HttpMethod.POST),
                    ArgumentMatchers.any(),
                    ArgumentMatchers.<Class<JsonNode>>any()))
            .thenReturn(new ResponseEntity<>(responseNode, HttpStatus.OK));

        httpDataService.getData("dataIdTest");


    }
}
 

Итак, когда я отлаживаю, я прохожу через тестовый класс, и все работает нормально, затем он переходит в HttpDataClient.java класс, чтобы getData() method and when I am in выполнить RestTemplate.exchange I can see that dataId is sent, then it goes down to .getBody();` и он ломается. И я ничего не получаю взамен.

Что я здесь упускаю? Любой совет приветствуется.

Комментарии:

1. Для начала, String.format не понимает шаблоны URI.

2. Это не так? что я должен тогда сказать, исходя из вашего мнения?

3. Предложение: LOGGER.debug exchange ответ перед вызовом getBody() на него. В частности, зарегистрируйте код состояния.

Ответ №1:

основываясь только на беглом взгляде — попробуйте изменить

 String.format("/data/{0}", dataId)
 

Для

 String.format("/data/%s", dataId)
 

в вашем методе ответа на данные getData(String dataId)