IT/Spring

[Spring] WebFlux 테스트 코드 작성

어린이개발자 2024. 11. 27. 22:33

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