#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. Я все еще получаю то же исключение. Я обновил свой вопрос своим интеграционным тестом. Не могли бы вы взглянуть?