Как смоделировать API, который возвращает строку JSON при загрузке Spring

#java #spring-boot #mocking

#java #spring-boot #издевательство

Вопрос:

Я новичок в попытке смоделировать внешний API в Spring Boot.

Вот API: https://jsonplaceholder.typicode.com/posts

Он возвращает строку JSON следующим образом:

 [
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipitnsuscipit recusandae consequuntur expedita et cumnreprehenderit molestiae ut ut quas totamnnostrum rerum est autem sunt rem eveniet architecto"
  },
...
  

Я попробовал следующий код:

     @Service
    public class BlogPostService {
        @Autowired
        private RestTemplate restTemplate;

        public String getAllBlogPosts() {
            ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", String.class);

            return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
        }

    }
  

Но в IDE есть ошибка в resp.getBody(), которая гласит:

Несоответствие типов: невозможно преобразовать из объекта в строку

Вот мой код для публикации в блоге:

 public class BlogPost {
    private int userId;
    private String title;
    private String body;

    public BlogPost() {
    }

    public BlogPost(int userId, String title, String body) {
        this.title = title;
        this.body = body;
    }
//...getters amp; setters
  

Как я могу это исправить? Надеюсь, без использования еще одного инструмента. Это всего лишь простое приложение для проверки концепции, поэтому я не хочу использовать JUnit или Mockito для тестирования.

Ответ №1:

API https://jsonplaceholder.typicode.com/posts возвращает массив объектов JSON. Вам нужно будет отразить это в желаемом типе ответа вашего запроса:

 public String getAllBlogPosts() {
    ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", BlogPost[].class);

    return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
  

Обратите [] внимание на BlogPost[].class .

Затем вы получаете a Type mismatch: cannot convert from Object to String , поскольку ResponseBody.getBody() возвращает общий тип T , который есть BlogPost[] , но ваша сигнатура метода возвращает a String .

Если все, что вам нужно, это строка JSON, то вы можете просто сделать это:

 public String getAllBlogPosts() {
    ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", String.class);

    return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
  

В противном случае, если вам нужен фактический массив POJO, сделайте это:

 public BlogPost[] getAllBlogPosts() {
    ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", BlogPost[].class);

    return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
  

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

1. Спасибо, что указали на эту глупую ошибку. Приятно знать, что я приближаюсь. Я внес изменения в String.class и обновил свой пост этим. К сожалению, я все еще получаю ту же ошибку.

2. Я исправил это, изменив строку на: ResponseEntity<String> resp = RestTemplate.getForEntity(» localhost:8080/posts «, String.class );