상똥이의 Back-End 공부방

[Board Project] 11. API 테스트 정의 본문

프로젝트/게시판 만들기

[Board Project] 11. API 테스트 정의

상똥백 2023. 10. 16. 19:11

[1. API환경 테스트]

1. 환경 준비

(1) test/java/프젝 경로에 controller.package생성 후, 안에 DataRestTest.class 생성

(2) 클래스 전체에 @SpringBootTest, @AutoConfigureMockMvc 삽입

- 웹과의 상호작용을 위해 MVC를 사용해야하지만, @WebMvcTest를 사용하면 slice test를 하기 때문에 컨트롤러 외의 빈은 로드하지 않고 최소한의 내용만 가져오기 때문에 AutoConfiguration만 가져온다.

(3) @DisplayName("Data Rest 테스트")

(3) 생성자 방식으로 아래와 같이 작성

private final Mvc mvc;

public DataRestTest(@Autowired MockMvc mvc){
	this.mvc=mvc;
}

 

2. 게시글 리스트 조회 테스트 생성

(1) @DisplayName("[ api] 게시글 리스트 조회"), @Test삽입하여 테스트 void 생성

(2) mvc를 이용해 게시글 리스트를 가져오는 get 기능을 사용한다

- 이때, get메소드를 사용하기 위해서 ctrl+spacebar를 눌러 MockMvc
RequestBuilders.get 메소드가 뜬다

- 그럼 alt+Enter를 눌러 import statically를 선택한다. (코드를 간결히 하기 위해)

(3) get메서드에 "/api/articles"를 작성하여 게시글을 선택한다

(4) andExpect를 사용하여 연결상태가 좋은지, hal+json타입의 글을 조회할 수 있는지 확인한다

-  andExpect는 주로 MVC에서 사용한다. 웹 요청에 대한 응답을 위해 사용하며 그 속성을 검사할 때 사용한다.

테스트 코드 (접은 글)

더보기
package com.fastcampus.projectboard.controller;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.transaction.annotation.Transactional;


import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@DisplayName("Data REST 테스트")
@Transactional
@AutoConfigureMockMvc
@SpringBootTest
public class DataRestTest {
    private final MockMvc mvc;

    public DataRestTest(@Autowired MockMvc mvc) {
        this.mvc = mvc;
    }

    @DisplayName("[api] 게시글 리스트 조회")
    @Test
    void givenNothing_whenRequestingArticles_thenReturnsArticlesJsonResponse() throws Exception {
        mvc.perform(get("/api/articles"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.valueOf("application/hal+json")));
    }

}

 

2. 게시글 단건 조회 테스트 생성

코드 (접은 글)

더보기
    @DisplayName("[api] 게시글 단건 조회")
    @Test
    void givenNothing_whenRequestingArticle_thenReturnsArticleJsonResponse() throws Exception {
        mvc.perform(get("/api/articles/1"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.valueOf("application/hal+json")));
    }

 

3. 게시글에 달른 댓글 리스트 조회 테스트

코드 (접은 글)

더보기
    @DisplayName("[api] 게시글 -> 댓글 리스트 조회")
    @Test
    void givenNothing_whenRequestingArticleCommentsFromArticle_thenReturnsArticleCommentsJsonResponse() throws Exception {
        mvc.perform(get("/api/articles/1/articleComments"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.valueOf("application/hal+json")));
    }

 

4. 댓글 리스트 조회 테스트

코드 (접은 글)

더보기
    @DisplayName("[api] 댓글 단건 조회")
    @Test void  givenNothing_whenRequestingArticleComment_thenReturnsArticleCommentJsonResponse() throws Exception {
        mvc.perform(get("/api/articleComments/1"))
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.valueOf("application/hal+json")));
    }