Весеннее тестирование SpringBootTest объяснение аннотации и проблемы - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в тестировании и сейчас тестирую сервисы и контроллеры в весеннем приложении.

Когда я начал делать интеграционные тесты на уровне сервиса, я разместил аннотацию

@SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)   

и всегда получал ошибку:

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest (classes = ...) with your test

А затем, как В качестве решения я установил аннотацию так:
@SpringBootTest (classes = MyApplication.class) и все работало нормально.

Однако теперь, когда я начал тестировать слой контроллера и мне нужен TestRestTemplate:

@Autowired
private TestRestTemplate restTemplate;

Я получаю сообщение об ошибке:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.ftn.controllers.AddressControllerTest': Unsatisfied dependency expressed through field 'restTemplate'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.test.web.client.TestRestTemplate' available: expected at least 1 bean which qualifies as an autowire candidate. Dependency annotations: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

Мой тестовый класс:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TicketServiceApplication.class)
@Transactional
@TestPropertySource("classpath:application-test.properties")
public class AddressControllerTest {

    @Autowired
    private AddressRepository addressRepository;

    @Autowired
    private TestRestTemplate restTemplate;

    private String accessToken;

    private HttpHeaders headers = new HttpHeaders();

    @Before
    public void login() {
        ResponseEntity<LoggedInUserDTO> login = restTemplate.postForEntity("/login",  new LoginDTO("admin", "admin"), LoggedInUserDTO.class);
        accessToken = login.getBody().getToken();
        headers.add("Authorization", "Bearer "+accessToken);
    }

    @Test
    public void testGetAllAddresses() {
        ResponseEntity<AddressDto[]> responseEntity = restTemplate.getForEntity("/api/address", AddressDto[].class);
        AddressDto[] addressesDto = responseEntity.getBody();
        AddressDto a1 = addressesDto[1];


        assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
        assertNotNull(addressesDto);
        assertNotEquals(0, addressesDto.length);
        assertEquals(2, addressesDto.length);
        assertEquals(AddressConst.DB_STATE, a1.getState());
        assertEquals(AddressConst.DB_CITY, a1.getCity());
        assertEquals(AddressConst.DB_STREET, a1.getStreet());
        assertEquals(AddressConst.DB_NUM, a1.getNumber());
    }
}

Какое решение является правильным и как правильно выполнять интеграционные тесты?
Почему у меня проблема с использованием webEnvironment в SpringBootTest?

РЕДАКТИРОВАТЬ: Теперь, когда я удаляю аннотацию @RunWith (), TestRestTemlpate имеет значение null, и у меня в первой строке теста есть NullPointerException, где я пытаюсь получить объект ответа.

Если кто-то может помочь и объяснить немного об этом, извините, но я новичок в весеннем тестировании. Спасибо!

...