#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)