#rest #unit-testing #spring-boot #spring-boot-starter
#rest #модульное тестирование #spring-boot #spring-boot-starter
Вопрос:
Включая spring-boot-starter-data-rest и другой репозиторий сохраняемости (в моем случае spring-boot-starter-data-mongodb), у вас автоматически создаются конечные точки для CRUD в REST (при условии, что у вас есть основной класс, содержащий метод main, аннотированный с помощью @SpringBootApplication на правильном уровне). Например, вы получаете конечную точку с GET, PUT, POST, DELETE и т.д. под вашим базовым путем при посещении http://locahost:8080/api/sampleEntities поскольку у меня есть SampleRepository для управления экземплярами SampleEntity.
Как я могу протестировать эти конечные точки в JUnit 5 Mockito Spring Boot?
Это мой текущий тестовый пример для справки, но единственная конечная точка, которую я вижу, — это конечная точка профиля.
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.context.ApplicationContext;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.hateoas.Resources;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import java.util.Collections;
import java.util.List;
import static java.util.Arrays.asList;
import static org.mockito.Mockito.doReturn;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleEntityRestTest {
@LocalServerPort private int port;
@MockBean private SampleRepository sampleRepository;
@Autowired private ApplicationContext applicationContext;
@Autowired private TestRestTemplate testRestTemplate;
@DisplayName("Mocking sample repository works.")
@Test
public void checkMockingWorks() {
List<SampleEntity> sampleEntityList = asList(SampleEntity.builder().firstName("firstname").lastName("lastname").email("some@some.com").build());
Page<SampleEntity> page = new PageImpl<>(sampleEntityList);
doReturn(page).when(sampleRepository).findAll(Pageable.unpaged());
SampleRepository sampleRepositoryFromContext = applicationContext.getBean("sampleRepository", SampleRepository.class);
List<SampleEntity> sampleEntityListFromContext = sampleRepositoryFromContext.findAll(Pageable.unpaged()).getContent();
Assertions.assertFalse(sampleEntityListFromContext.isEmpty());
Assertions.assertEquals("firstname", sampleEntityListFromContext.get(0).getFirstName());
Assertions.assertEquals("lastname", sampleEntityListFromContext.get(0).getLastName());
Assertions.assertEquals("some@some.com", sampleEntityListFromContext.get(0).getEmail());
}
@Test
public void testCrudOfSampleEntity() {
List<SampleEntity> sampleEntityList = asList(SampleEntity.builder().firstName("firstname").lastName("lastname").email("some@some.com").build());
Page<SampleEntity> page = new PageImpl<>(sampleEntityList);
doReturn(page).when(sampleRepository).findAll(Pageable.unpaged());
ResponseEntity<Resources<SampleEntity>> resourcesResponseEntity = testRestTemplate.exchange(
Constants.ENDPOINT ":" port "/api/" Constants.SAMPLE_ENTITY,
HttpMethod.GET,
null,
new ParameterizedTypeReference<Resources<SampleEntity>>() {},
Collections.emptyList());
Assertions.assertEquals(200, resourcesResponseEntity.getStatusCode());
}
}
Запуск фактического приложения и указание на http://localhost:8080/api/sampleEntities работает нормально.
Фактический класс приложения выглядит следующим образом:
package com.somepackage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SomeRestApiApplication {
public static void main(String[] args) {
SpringApplication.run(SomeRestApiApplication.class, args);
}
}
Может кто-нибудь дать мне пример кода о том, как создавать мои тестовые классы и методы для тестирования конечных точек rest, автоматически генерируемых spring-boot-starter-data-rest?
Комментарии:
1. вы нашли способ для этого? Должен быть автоматический способ модульного тестирования rest api