Spring 테스트 코드 관련하여 참고하기 위해 찾아보는 가운데, Spring MVC 환경에서의 테스트 코드에 대한 글은 많이 있지만 WebFlux 환경에서의 테스트 코드 글의 갯수는 적은 것 같아 직접 포스팅하고자 한다.
- Environment
> Java 11
- HTTP 메서드
> GET, POST, PUT
Layer 별로 테스트 코드를 작성하였고, 그 순서는 다음과 같다.
- Handler (Router) -> Service -> Repository
그리고 given / when / then 구조에 맞춰 작성해 보았다.
먼저 GET 메서드 기준, Layer 별로 테스트 코드를 작성한다.
1. Handler
@Transactional
@SpringBootTest
@AutoConfigureWebTestClient
public class UsersHandlerTest {
@Autowired
private WebTestClient webTestClient;
@SpyBean
private UsersService usersService;
private Users mockUsers;
@BeforeEach
public void setUp() {
SessionRequest mockRequest = new SessionRequest();
String usersId = "USR000001";
Map param = new HashMap();
param.put("users_id", usersId);
mockRequest.setParam(param);
mockUsers = new Users();
mockUsers.setUsersNo(1);
mockUsers.setUsersId(usersId);
mockUsers.setName("판매처1");
mockUsers.setEmail("test@email.com");
mockUsers.setPhone("01012345678");
mockUsers.setRegNo("495-12231234");
SessionRequest response = new SessionRequest();
response.setResponse(mockUsers);
given(usersService.fetchUsersById(mockRequest)).willReturn(response);
}
@Test
public void fetchUsersByIdTest() {
// given
String usersId = "USR000001";
// when
Users resultUsers = webTestClient.get()
.uri(uriBuilder ->
uriBuilder
.path("/users/details")
.queryParam("users_id", usersId)
.build())
.exchange()
.expectStatus().isOk()
.expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
.expectBody(Users.class)
.returnResult().getResponseBody();
// then
assertThat(resultUsers.getUsersId()).isEqualTo(mockUsers.getUsersId());
assertThat(resultUsers.getName()).isEqualTo(mockUsers.getName());
}
}
2. Service
@Transactional
@SpringBootTest
public class UsersServiceTest {
@Autowired
private UsersService usersService;
@Test
public void fetchUsersByIdTest() {
// given
String usersId = "USR000001";
// when
SessionRequest request = new SessionRequest();
request.setParam(Map.of("users_id", usersId));
SessionRequest response = usersService.fetchUsersById(request);
Users users = (Users) response.getResponse();
// then
assertThat(response.getResponse()).isNotNull();
assertThat(users.getUsersId()).isEqualTo(usersId);
}
}
3. Repository
@Transactional
@SpringBootTest
public class UsersRepository {
@Autowired
private UsersRepository usersRepository;
@DisplayName("사용자 상세 조회")
@Test
public void testFindUsersByUsersId() {
// given
String usersId = "USR000001";
// when
Users users = usersRepository.findByUsersId(usersId);
// then
assertThat(users).isNotNull();
assertThat(users.getUsersId()).isEqualTo("USR000001");
}
}
다음은 POST 메서드 기준이다.
1. Handler
@Test
public void registerNewUsersTest() {
// when
Map resultMap = webTestClient.post()
.uri(uriBuilder ->
uriBuilder
.path("/users")
.queryParam("name", "사용자1")
.queryParam("email", "testuser@test.com")
.build())
.exchange()
.expectStatus().isOk()
.expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
.expectBody(Map.class)
.returnResult()
.getResponseBody();
}
2. Service
@Test
public void addUsersTest() {
// given
String usersId = "USR000002";
SessionRequest request = new SessionRequest();
request.setParam(Map.of("name", "사용자1", "email", "testuser@test.com"));
// when
SessionRequest response = usersRepository.registerNewUser(request);
Map responseMap = (Map) response.getResponse();
// then
assertThat(responseMap.get("users_id")).isNotNull();
assertThat(responseMap.get("users_id")).isEqualTo(usersId);
}
3. Repository
@AfterEach
public void tearDown() {
Users users = usersRepository.findByUsersId("USR000002");
if (bePresent(users)) {
usersRepository.deleteByUsersId("USR000002");
}
}
@DisplayName("사용자 신규 등록")
@Test
public void testAddUsers() {
// given
Users users = new Users();
users.setUsersId("USR000002");
users.setEmail("testuser@test.com");
// when
Users savedUsers = usersRepository.save(users);
// then
assertThat(savedUsers).isNotNull();
assertThat(savedUsers.getUsersId()).isEqualTo("USR000002");
assertThat(savedUsers.getEmail()).isEqualTo("testuser@test.com");
}
마지막으로 PUT 메서드 기준이다.
1. Handler
@Test
public void updateUsersInfoTest() {
// when
webTestClient.put()
.uri(uriBuilder ->
uriBuilder
.path("/user")
.queryParam("name", "사용자1")
.queryParam("email", "testuser@test.com")
.build())
.exchange()
.expectStatus().isOk()
.expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
.expectBody(Map.class);
}
2. Service
@Test
public void updateUsersTest() {
// given
String usersId = "USR000001";
SessionRequest request = new SessionRequest();
request.setParam(Map.of("users_id", usersId, "name", "사용자1", "email", "testuser@test.com"));
// when
usersRepository.updateUserInfo(request);
}
3. Repository
@DisplayName("사용자 수정")
@Test
public void updateUsers() {
// given
String usersId = "USR000001";
Users users = usersRepository.findByUsersId(usersId);
// when
users.setName("사용자123");
users.setEmail("testisgood@test.com");
usersRepository.save(users);
// then
assertThat(users).isNotNull();
assertThat(users.getName()).isEqualTo("사용자123");
assertThat(users.getEmail()).isEqualTo("testisgood@test.com");
}
추후 목표)
1. @SpringBootTest / @DataJpaTest / @WebFluxTest 에 대해 각각 사용하는 경우 조사
2. @MockBean vs. @SpyBean 비교 조사
'IT > Spring' 카테고리의 다른 글
[Spring] Spring Framework vs. Spring Boot (2) | 2024.11.14 |
---|---|
[Spring] Spring IoC Container (0) | 2023.05.21 |
[Spring] Entity, DTO, DAO, VO 란? (0) | 2022.11.30 |