인수테스트를 할 때, 상속받을 AcceptanceTest 클래스에 대한 설명이다.
기본적으로 아래와 같이 작성이 되어있어야, api통신을 할 수가 있다. 이 코드는 최종 코드이고 하나씩 작성하면서 각 설정들이 왜 필요한지 알아보자.
1. 기본적인 인수테스트 클래스
User에 대한 인수테스트를 작성할 클래스이다.
아직 다른 클래스들은 존재하지 않는다. 이 클래스에 테스트를 작성해보도록 하자.
유저이름을 조회하는 인수테스트를 작성해보았다.
@Test 어노테이션을 붙였기 때문에 테스트 실행이 가능하다.
API호출은 RestAssured를 통해서 할 예정이다.
테스트를 실행해보겠다.
테스트는 실패했다. 아래 빨간 글씨를 보면 Connecttion refused: connect라고 나오고
바로 윗줄의 Test worker가 찍은 로그를 보면 localhost:8080으로 커넥션을 연결하려 시도를 타임아웃이 발생하고 재시도를 했지만 역시 연결이 되지 않는다.
그 이유는 당연하다. 우리는 스프링부트로 Application을 실행시켜준 적이 없다. 당연히 서버가 안 켜져 있으니 커넥션을 맺을 수가 없는 것이다. 따라서 테스트를 할 때, 스프링부트가 켜졌으면 좋겠다. 아래 어노테이션이 그런 설정이다.
@SpringBootTest
해당 테스트를 스프링부트를 기동한 환경에서 실행하겠다는 얘기이다.
스프링부트를 실행할 필요가 없는 테스트라면 @SpringBootTest라는 어노테이션을 달 필요가 없다.
인수테스트는 API통신을 할 것이기 때문에 스프링부트를 실행하여야 하므로 꼭 필요한 어노테이션이다.
이제 해당 어노테이션을 붙이고 테스트를 다시 실행해보겠다.
짠, 스프링부트가 가동됐다. 이로써 서버가 실행된 것이다.
그런데 왜일까. 테스트는 여전히 실패한다.
여전히 똑같은 빨간 글씨가 뜬다... (또 서버는 실행이 되지 않은 것 처럼 보인다.)
아까 붙인 @SpringBootTest를 좀 살펴보자.
@SpringBootTest의 webEnvironment를 살펴보면, default로 MOCK으로 되어있다.
MOCK은 WebApplicationContext를 mock servlet environment로 생성한다고 나와있다.
실제 서버를 띄우는 것이 아니라, mocking한 것으로 띄우기 때문에, 서버와 통신을 할 수 없었던 것이다.
따라서 환경을 바꿔보도록 하자.
DEFINED_PORT로 설정하여 테스트를 실행해보자.
테스트 결과가 바뀌었다!
Connection refused가 아닌 404 not found 응답이 왔다.
이는 해당 path를 찾지 못해서 스프링이 반환해준 결과이다.
아무튼 @SpringBootTest를 통해서
테스트환경에서 서버를 띄우고, api통신을 한다는 사실까지 확인하였다.
현재까지 작성된 코드는 다음과 같다.
다음 글에서는 글 처음에 보았던 AcceptanceTest클래스에서 보았던 RANDOM_PORT와 @BeforeEach를 해야하는 이유,
그리고 AcceptanceTest클래스에 작성하여야 하는 이유에 대해서 살펴보겠다.
'spring' 카테고리의 다른 글
slf4j가 Logger 구현체를 선택하는 방법(feat. Logger만들기) (0) | 2022.09.02 |
---|---|
Tip. 자동으로 getLogger 코드 작성 당하기(feat. IntelliJ File and Code Templates) (0) | 2022.08.30 |
눈팅으로 하는 웹 어플리케이션 서버 실습 (0) | 2022.08.23 |