본문 바로가기

WEB/Java

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 02-1 테스트코드 작성

1 어플리케이션 코드 작성

package com.example.boilerplate;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@SpringBootApplication
@SpringBootApplication으로 인해 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정됩니다. 특히나 @SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야만 합니다.

 

💡 Annotation

Annotation은 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리해야하는지 알려주는 메타데이터라고 볼 수 있다.

Annotation은 다음 세 가지 용도로 사용된다.

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
  • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공

2 간단한 Controller 작성

/hello 엔드포인트로 get 요청을 받으면 문자열 "hello"를 리턴하는 컨트롤러를 작성한다.

(이 프로젝트에서는 web 패키지에 컨트롤러와 관련된 클래스를 모두 담을 예정)

package com.example.boilerplate.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}
@RestController
• 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줍니다.
• 예전에는 @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해준다고 생각하면 됩니다.

@GetMapping
• HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 줍니다.
• 예전에는 @RequestMapping(method = RequestMethod.GET)으로 사용되었습니 다. 이제 이 프로젝트는 /hello로 요청이 오면 문자열 hello를 반환하는 기능을 가지게 되었습니다.

3 테스트 클래스 작성

JUnit 이라는 테스트 프레임워크를 이용해 /hello 엔드포인트로 get 요청을 보냈을 때, 응답이 hello인지 확인하는 테스트 코드 작성.

  • 테스트 코드는 src/test/java 에 위치한다.
  • 테스트 클래스는 대상 클래스 이름에 Test를 붙인다.
package com.example.boilerplate.web;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
}

 

JUnit
java 테스트 프레임워크

@RunWith(SpringRunner.class)
• 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킵니다.
• 여기서는 SpringRunner라는 스프링 실행자를 사용합니다.
• 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 합니다.

@WebMvcTest(controllers = HelloController.class)
• 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션 입니다.
• 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있습니다.
• 단, @Service, @Component, @Repository 등은 사용할 수 없습니다.
• 여기서는 컨트롤러만 사용하기 때문에 선언합니다.

@Autowired
• 스프링이 관리하는 빈(Bean)을 주입 받습니다.

@Test
• JUnit에게 해당 method가 test case 임을 명시함


private MockMvc mvc;
• 웹 API를 테스트할 때 사용합니다.
• 스프링 MVC 테스트의 시작점입니다.
• 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있습니다.

mvc.perform(get("/hello"))
• MockMvc를 통해 /hello 주소로 HTTP GET 요청을 합니다.
• 체이닝이 지원되어 코드에 볼 수 있듯이 여러 검증기능을 이어서 선언할 수 있습니다.