본문 바로가기
Spring

[Spring] TDD 도입기(5) feat) Controller 계층

by windy7271 2024. 12. 30.
728x90
반응형

오늘은 컨트롤러  계층을 개발하려고 합니다.

 

컨트롤러는 함수 호출이 아닌 API 호출을 통해 요청을 받고 응답을 처리하고, 메세지 컨버팅 같은 작업이 필요합니다. 그래서 MockMVC 라는 클래스를 이용합니다.

 

초기화

@ExtendWith(MockitoExtension.class)
@WebMvcTest(MemberController.class)
public class MemberControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private JwtTokenProvider jwtTokenProvider;
    @MockBean
    private JpaMetamodelMappingContext jpaMetamodelMappingContext;

}

 

 

타겟은 MemberController.Class 가 될것입니다. 

 

이것도 마찬가지로 실패하는 코드를 먼저 작성해줍니다.

 

1. 인가되지 않은 사용자 접근

@Test
@DisplayName("getMyEmailAndRole : ErrorCase1.인가되지 않은 사용자 접근")
void test1() throws Exception {
    final String url = "/api/members/getMyEmailAndRole";
    final ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.get(url));
    resultActions.andDo(print()).andExpect(status().isUnauthorized());
}

 

mockMvc.perform() 은 요청을 실행하는것이고, 어느 URL 로 요청 할지는 MockMvcRequestBuilder 에 url을 넣어서 완성 시켜줍니다.

 

2. 성공하는 코드

 

@Test
@DisplayName("getMyEmailAndRole : Success1.접근 성공")
@WithAuthUser
void test2() throws Exception {
    Gson gson = new Gson();
    final String url = "/api/members/getMyEmailAndRole";

    LoginDataResDto mockResponse = new LoginDataResDto("fa7271@naver.com", "USER");
    doReturn(mockResponse).when(memberService).getMyEmailAndRole(any());

    // MockMvc 요청
    final ResultActions resultActions = mockMvc.perform(
            MockMvcRequestBuilders.get(url)
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(gson.toJson(new ArrayList<String>())));

    // 응답 검증
    resultActions.andExpectAll(
            status().isOk(),
            jsonPath("message").value("getMyEmailAndRole Success"), // "message" 필드 검증
            jsonPath("data.email").value("fa7271@naver.com"),       // "data.email" 필드 검증
            jsonPath("data.role").value("USER")                    // "data.role" 필드 검증
    ).andDo(print());
}

 

 

 

요청의 Content-Type 을 설정합니다 . 서버에서 전달하는 데이터의 형식을 말하며 여기서는 JSON 입니다.

요청본문을 JSON  형식의 문자열로 반환합니다. 

 

그러면 바디에

Body =
	{"message":"getMyEmailAndRole Success",
	"data":
        {
        "email":"fa7271@naver.com",
        "role":"USER"
        }
	}

 

이렇게 담겨서 오는데 이것을 

andExpectAll 로 검증해주시면 됩니다.

 

 

반응형

댓글