Как использовать TestRestTemplate для запроса post без тела запроса

#spring-boot #post #uri #integration-testing #resttemplate

#весенняя загрузка #Публикация #uri #интеграция-тестирование #resttemplate

Вопрос:

У меня есть конечная точка rest, как показано ниже:

 @PostMapping(value = "/customers/{customerId}")
public SomeResponse manageCustomers(@PathVariable  String customerId){
...
}
  

Эта конечная точка выбирает данные клиента из одной системы для данного CustomerID и сохраняет их в другой системе. Таким образом, для этого не требуется никакого тела запроса.

Мне нужно написать интеграционный тест для этого. Когда я использую TestRestTemplate для этого, я не могу найти достаточно хороший метод, где я могу передать requestEntity как null. Всякий раз, когда я это делаю, я получаю исключение, говорящее «UriTemplate не должен быть нулевым».

Я пытался использовать методы ‘postForObject’, ‘exchange’, но не работает. Есть идеи?

Ниже мой ИТ:

 @SpringBootTest(webEnvironmentSpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext
@ActiveProfiles("test")
class CustomerIT extends Specification{

@LocalServerPort
private int port;

@Autowired
private TestRestTemplate restTemplate

def "should get customer from first system and save in second system"() {

    given:
    def customerUrl = new URI("http://localhost:"   port   "/customers/1234")
    def expected = new SomeObject(1)

    when:
    def someObject =
            restTemplate.postForEntity(customerUrl, null, SomeObject.class)

    then:
    someObject != null
    someObject == expected
}
}
  

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

1. Если expected , secondSystemMockUrl и uriTemplate есть null , я бы начал с выяснения, почему это так. Не могли бы вы, возможно, создать второй IT, который имитирует минимальный, который я написал, без всего лишнего? Даже если вы не заглушите secondSystem, возможно, у вас будет другое исключение?

2. Я удалил все содержимое wiremock и попытался запустить его снова, чтобы увидеть, достигает ли он, по крайней мере, контроллера, но я все равно получаю то же исключение, что и UriTemplate, равное null. Дайте мне знать, если вы что-то придумаете, но в любом случае спасибо за просмотр.

3. Возможно, вы могли бы опубликовать ЕГО урезанный?

4. Отредактировал мой пост с минимальным IT.

5. Просто пара вещей, которые нужно попробовать. 1) Удалите @Autowired и просто new restTemplate . 2) customerUrl из URI в String и 3) удалите @DirtiesContext — и, возможно, даже @ActiveProfiles("test") . Я действительно не ожидаю, что что-либо из этого изменит ситуацию, а просто удалит все. И, возможно, посмотрите, какие области действия любой тестовой платформы вы используете — я с этим не знаком. Чрезвычайно надуманный, но, возможно, given: область недоступна в when: области

Ответ №1:

Использование postForEntity(url, null, ResponseType.class) работает для меня.

Мое postmapping равно вашему, за исключением responseType. Я использовал Map только в качестве примера

 @PostMapping(value = "/customers/{customerId}")
public Map<String, String> manageCustomers(@PathVariable String customerId){
    return new HashMap<String, String>(){{ put("customerId", customerId); }};
}
  

Протестируйте, чтобы убедиться, что это работает

 @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CustomerControllerTest {

    @LocalServerPort
    private int port;

    private final TestRestTemplate testRestTemplate = new TestRestTemplate();

    @Test
    public void postEmptyBodyShouldReturn200OK() {
        String customerId = "123";
        ResponseEntity responseEntity = testRestTemplate
                .postForEntity(format("http://localhost:%s/ping/customers/%s", port, customerId), null, Map.class);
        assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(responseEntity.getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_JSON_UTF8);
        assertThat(responseEntity.getBody()).isNotNull();
        assertThat(((LinkedHashMap) responseEntity.getBody()).size()).isEqualTo(1);
        assertThat(((LinkedHashMap) responseEntity.getBody()).get("customerId")).isEqualTo(customerId);
    }
}
  

Запуск этого теста в maven

 $ mvn -Dtest=CustomerControllerTest test

    (...removed unnecessary output...)

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.137 s - in com.ins.example.demo.rest.CustomerControllerTest
10:04:54.683 [Thread-3] INFO  o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.940 s
[INFO] Finished at: 2019-04-07T10:04:55 02:00
[INFO] ------------------------------------------------------------------------
  

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

1. Я все еще получаю то же исключение. Я обновил свой вопрос своим интеграционным тестом. Не могли бы вы взглянуть?