Как использовать testRestTemplate для пост-запроса без тела запроса - PullRequest
0 голосов
/ 06 апреля 2019

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

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

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

Мне нужно написать интеграционный тест для этого. Когда я использую testRestTemplate для этого, я не могу найти достаточно хороший метод, где я могу передать requestEntity как ноль. Всякий раз, когда я это делаю, я получаю исключение, говорящее «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 Ответ

0 голосов
/ 07 апреля 2019

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

Мое пост-отображение равно вашему, за исключением 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] ------------------------------------------------------------------------
...