Server/Spring Boot

[Springboot] 통합 테스트 코드 작성해보기 (Controller)

hoonylab 2025. 4. 21. 15:48
728x90
반응형

Spring Boot Controller 통합 테스트 (JUnit 5 + MockMvc)

이번에는 UserService를 사용하는 UserController에 대한 통합 테스트 예제를 알아봅니다. Spring Boot의 @SpringBootTestMockMvc를 활용하여 실제 HTTP 요청/응답 시나리오를 검증할 수 있습니다.

1. 컨트롤러 클래스 (UserController.java)


@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User saved = userService.createUser(user.getName(), user.getEmail());
        return ResponseEntity.ok(saved);
    }

    @GetMapping("/{email}")
    public ResponseEntity<User> getUserByEmail(@PathVariable String email) {
        return userService.getUserByEmail(email)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }
}

2. 통합 테스트 클래스 (UserControllerIntegrationTest.java)


@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private UserRepository userRepository;

    @BeforeEach
    void setup() {
        userRepository.deleteAll();
    }

    @Test
    void testCreateUser() throws Exception {
        String json = """
            {
              "name": "Charlie",
              "email": "charlie@example.com"
            }
        """;

        mockMvc.perform(post("/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(json))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name").value("Charlie"))
                .andExpect(jsonPath("$.email").value("charlie@example.com"));
    }

    @Test
    void testGetUserByEmail() throws Exception {
        userRepository.save(new User(null, "Dana", "dana@example.com"));

        mockMvc.perform(get("/users/dana@example.com"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name").value("Dana"))
                .andExpect(jsonPath("$.email").value("dana@example.com"));
    }
}

마무리

위와 같이 MockMvc를 활용하면, 컨트롤러 레이어의 HTTP API를 실제처럼 테스트할 수 있습니다. 통합 테스트는 각 계층이 잘 연결되어 있는지 확인하는 데 중요한 역할을 하며, 특히 REST API 테스트에 매우 유용합니다.

728x90
반응형