Rest Template GET и выпуск метода testBuilder для Spring - PullRequest
0 голосов
/ 28 мая 2018

У меня есть метод GET, мне нужно протестировать, используя шаблон отдыха:

@ApiOperation("Finds all existing Tag")
@ApiResponses({
        @ApiResponse(code = 200, message = "When list of new tag has been found."),
        @ApiResponse(code = 404, message = "When unable to find any tag"),
    })
    @RequestMapping(method = RequestMethod.GET)
    @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<Tag>> findAllEvents() {
        log.info("Find All Tags");

        return ResponseEntity.ok(TagEventRepository.findAllEvents());
    }

}

мой тест выглядит так:

@Test
    public void findAllEvents() {

        //GIVEN
ParameterizedTypeReference<List<Tag>> newTag = new ParameterizedTypeReference<List<Tag>>(){};
        TagTestBuilder
            .withFullList()
            .withSaved()
            .buildList();

            //WHEN
            ResponseEntity<List<Tag>> response = restTemplate.exchange(TagResourceConstants.PATH, HttpMethod.GET, null, newTag);

            //THEN
            assertEquals(HttpStatus.OK.value(),response.

            getStatusCodeValue());

    }

Моя проблема в том, что я не могу связать ссылку на параметризованный тип(чтобы продолжить с List в качестве возвращаемого объекта) к tagTestBuilder, который создает полный список тегов и расширяет абстрактный класс TestBuilder, который реализует такие методы, как .createFullList, save и builtList

В вышеприведенной версии тестпройдет - но это неверно, так как он не создает правильный список нужных мне объектов (не используя TestBuilder).

Я, конечно, могу связать список с testBuilder, но не могу разрешить метод обмена restTemplate, такой как:

List<Tag> newTag = (List<Tag>) TagTestBuilder
            .withFullList()
            .withSaved()
            .buildList();

            //WHEN
            ResponseEntity<List<Tag>> response = restTemplate.exchange(TagResourceConstants.PATH, HttpMethod.GET, null, newTag);

            //THEN
            assertEquals(HttpStatus.OK.value(),response.

            getStatusCodeValue());

    }

Я получаю ошибку ниже, понимаю, что форма неправильная, но имеюпонятия не имею, как написать это правильно.

Error:(82, 71) java: no suitable method found for exchange(java.lang.String,org.springframework.http.HttpMethod,<nulltype>,java.util.List<Tag>)
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(java.lang.String,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity<?>,java.lang.Class<T>,java.lang.Object...) is not applicable
      (cannot infer type-variable(s) T
        (argument mismatch; java.util.List<Tag> cannot be converted to java.lang.Class<T>))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(java.lang.String,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity<?>,java.lang.Class<T>,java.util.Map<java.lang.String,?>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(java.net.URI,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity<?>,java.lang.Class<T>) is not applicable
      (cannot infer type-variable(s) T
        (argument mismatch; java.lang.String cannot be converted to java.net.URI))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(java.lang.String,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity<?>,org.springframework.core.ParameterizedTypeReference<T>,java.lang.Object...) is not applicable
      (cannot infer type-variable(s) T
        (argument mismatch; java.util.List<Tag> cannot be converted to org.springframework.core.ParameterizedTypeReference<T>))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(java.lang.String,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity<?>,org.springframework.core.ParameterizedTypeReference<T>,java.util.Map<java.lang.String,?>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(java.net.URI,org.springframework.http.HttpMethod,org.springframework.http.HttpEntity<?>,org.springframework.core.ParameterizedTypeReference<T>) is not applicable
      (cannot infer type-variable(s) T
        (argument mismatch; java.lang.String cannot be converted to java.net.URI))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(org.springframework.http.RequestEntity<?>,java.lang.Class<T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))
    method org.springframework.boot.test.web.client.TestRestTemplate.<T>exchange(org.springframework.http.RequestEntity<?>,org.springframework.core.ParameterizedTypeReference<T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))

Также попытался написать этот тест, используя метод getEntity, и, наконец, это работает, но я должен отладить тест, чтобы убедиться:

@Test
    public void findAllEvents() {

        //GIVEN
        List<Tag> newTag = (List<Tag>) TagTestBuilder
            .withFullList()
            .withSaved()
            .buildList();

            //WHEN
            ResponseEntity<Tag[]> response = restTemplate.getForEntity(TagResourceConstants.PATH, Tag[].class, newTag);

            //THEN
            assertEquals(HttpStatus.OK.value(),response.

            getStatusCodeValue());

Я отлаживаю обе версии этого теста (getEntity с [] и использую параметризованную ссылку на тип, и они обе, кажется, работают должным образом.

1 Ответ

0 голосов
/ 28 мая 2018

Четвертый аргумент в restTemplate.exchage - responseType, и он только сообщает методу exchange, в какой класс должен быть преобразован ответ.Он принимает переменную типа Class.Он также может принять ParameterizedTypeReference, если ответом является список объектов.

Предоставление данных, т. Е. Списка тегов в вашем случае, для этого аргумента не имеет смысла.

Ваш первый кодовый блок правильный.Вам не нужно передавать список Tags методу restTemplate

ParameterizedTypeReference<List<Tag>> responseType = new ParameterizedTypeReference<List<Tag>>(){};
ResponseEntity<List<Tag>> response = restTemplate.exchange(TagResourceConstants.PATH, HttpMethod.GET, null, responseType);
...