티스토리 뷰

 

1. @webMvcTest 를 사용한 스프링 부트 테스트

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

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void hello() throws Exception {
        String hello = "hello";

        mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    	}
    }
  • @RunWith(SpringRunner.class)는 스프링부트 테스트와 Junit 사이에 연결자 역할을 한다 - junit4 필수
  • @Autowired를 통하여 스프링이 관리하는 Bean을 주입받는다
  •  MockMvc는 스프링에서 제공하는 애플리케이션을 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스이다
  • @WebMvcTest 어노테이션을 사용하여 외부연동과 관련된 부분 (web)에 대한 테스트에 집중 할 수 있는 어노테이션이다. 그러므로 @Serivce @Repository 에 대한 테스트는 불가하다 

 

2. @SpringBootTest & webApplicationContext를 사용한 스프링 부트 테스트

 

앞서 말했듯 @WebMvcTest는 단순히 Web layer에 대한 테스트를 수행하기 때문에 service 그리고 repository에 대한 테스트를 실행할 수 없다. 하지만 SpringBootTest와 WebApplicationContext를 사용한다면 테스트 수행이 가능하다

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CommonTest {
    @LocalServerPort
    protected int port;

    @Autowired
    protected WebApplicationContext webApplicationContext;

    protected MockMvc mockMvc;

    protected final String URL = "http://localhost:";
    
     @Before
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .build();
    }
    
     @Test
    public void testGetPostsAndCheckSuccessWhenGuest() throws Exception {
        //when
        MvcResult mvcResult = mockMvc.perform(
                get(POST_URL)
                    .contentType(MediaType.APPLICATION_JSON)
        ).andReturn();

        //then
        assertEquals(200, mvcResult.getResponse().getStatus());
    		}
    
		}
    
    }

 

  • @SpringBootTest는 스프링부트 어플리케이션 테스트에 필요한 거의 모든 의존성을 제공해 준다. 
    • @SpringBootApplication을 기준으로 스프링 빈을 등록함과 동시에 빌드 툴에 의해 추가된 스프링부트 의존성 제공
    • @SpringBootTest 어노테이션에는 webEnvironment라는 값을 통해 웹 어플리케이션 테스트시 Mock으로 테스트할 것인지 실제 톰캣 같은 서블릿 컨테이너를 구동해서 테스트할 것인지를 정할 수 있다
    •  위의 코드는 랜덤 포트를 줌으로써 서블릿 컨테이너를 구동해서 테스트 하였다
  • WebApplicationContext는 Spring의 ApplicationContext를 확장한 인터페이스로, 웹 애플리케이션에서 필요한 몇 가지 기능을 추가한 인터페이스다 객체를 생성하여 mockMvc에 설정해줌으로써 실제 서블릿 컨테이너로 테스트를 할 수 있다
  • @Before은 테스트가 실행되기 전에 실행되어야 하는 메소드에 선언하여 사용한다. 위의 코드 같은 경우는 MockMvc를 생성하는 메소드에 선언함으로써 테스트가 실행되기전 MockMvc 객체를 생성하여 준다

 

3. given-when-then 방식으로 테스트 코드 작성하기

 @Test
    public void testGetCommentsSuccess() throws Exception {

        //given
        String writerAccessToken = createUser().getAccessToken().getToken();
        Long postId = createPost(writerAccessToken).getDetailedPost().getId();

        //when
        MvcResult mvcResult = mockMvc.perform(
                get(POST_URL + "/" + postId + "/comments")
        ).andReturn();

        //then
        assertEquals(200, mvcResult.getResponse().getStatus());
    }
  • given은 실제 테스트 해보려는 기능에 대하여 사전으로 필요한 데이터들을 생성해내는 작업
    • 위의 코드는 게시글에 대한 댓글을 작성하는 기능을 테스트하기 위한 코드인데 http의 get 메소드의 파라미터로 필요한 댓글이 달릴 게시글의 id 와 accessToken을 생성해주는 작업을 하였다
  • when은 실제 테스트 해보려는 기능을 작성
    • HTTP 통신에 대한 테스트를 실행하는 부분이다 메소드의 종류 (위 코드에서는 get)와 url 경로 설정하고 결과값을 리턴하는 andReturn()을 하였다. - mockMv.perform에 대한 다양한 기능이 많으므로 용도에 맞게 사용하도록 한다
  • then은 실행한 테스트가 예상된 결과값을 내는지에 대한 점검
    • assertEquals는 junit에서 제공하는 검증 메소드이다 assertEquals(예상결과, 실제 테스트 결과)의 형식으로 입력하여 테스트에 대한 결과를 검증하는 부분이다 위의 코드에서는 테스트 코드의 상태코드를 비교하여 검증하였다
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함