어제 오류가 뜨던 테스트 클래스에 대해서 찾아보다보니
package com.start.khw.springboot.web;
import org.junit.Test;
//import org.junit.jupiter.api.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;
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;
@RunWith(SpringRunner.class) //1
@WebMvcTest(controllers = HelloController.class) //2
public class HelloControllerTest{
@Autowired //3
private MockMvc mvc;
@Test
public void hello_is_returned() throws Exception{
String hello = "hello";
mvc.perform(get("/hello")) //5
.andExpect(status().isOk()) //6
.andExpect(content().string(hello));
}
}
HelloControllerTest
이런 블로그 글을 찾게 되었다 (말투 같은 경우는 혼용해서 쓸 예정 )
그러면, 어차피 지금 클래스도 몇개 없는 상황인데다, 앱 자체는 문제가 없는 상황이므로 굳이 지정해서 test를 돌릴 필요가 있을까? 하는 생각이 들었다
@RunWith(SpringRunner.class) //1
@WebMvcTest//2
public class HelloControllerTest{
@Autowired //3
private MockMvc mvc;
@Test
public void hello_is_returned() throws Exception{
String hello = "hello";
mvc.perform(get("/hello")) //5
.andExpect(status().isOk()) //6
.andExpect(content().string(hello));
그래서, @WebMvcTest 어노테이션 코드 부분에서
(controllers = HelloController.class)
컨트롤러를 지정하는 부분을 빼고 테스트를 돌려봤다
테스트 통과?!
저 지정하는 부분이 문제였던건가 하고 다시 넣고 돌려본결과
역시 테스트가 돌아간다...
움..? 캐시를 지우고 재부팅을 하고 돌려도 마찬가지였다
그래서 노트북에 파일들을 그대로 옮겨서 테스트를 돌렸더니, 처음에는 역시나 어제와 같이 404오류가 뜨더니,
(controllers = HelloController.class)
이부분을 빼고 돌리면 성공, 성공한 후에는 다시 넣고 돌려도 테스트는 성공이였다... 어떤 원리로 이렇게 되는지... 아직은 잘 모르겠지만 일단 테스트가 돌아가니까 이어서 해보기로 했다
02_2 롬복 소개 및 설치
- 롬복 lombok
자바 개발자들의 필수 라이브러리(의존성)라고 한다
자바 Domain(DTO, VO) 에서 반복적으로 작성되는 getter/setter나 toString, 생성사 코드 등의 소스들을, 어노테이션(Annotaion)을 사용하여 생략할 수 있도록 컴파일 시점에 자동으로 생성해주는 라이브러리라고
// 롬복 lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
build.gradle에 깃에 있던 코드를 넣었다
=> build에 변화를 줬으니, refresh(gradle프로젝트를 재실행)하고, 플러그인을 설치해야함
설치해주고, 적용하기 위해서 재실행 해줌
또, 사용하기 위해서는 해줘야할 설정이 있음
파일 -> 설정 -> 빌드,실행,배포 -> 컴파일러 -> 어노테이션프로세서 에서 어노테이션 처리 활성화
02_3 기존 코드를 롬복 lombok으로 리팩터링
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter //1
@RequiredArgsConstructor //2
public class HelloResponseDto {
private final String name;
private final int amount;
}
응답을 해주기 위한 dto 클래스를 생성하고
dto클래스를 테스트 함
import org. junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
@Test
public void lombok_function_test(){
//given
String name = "test";
int amount = 1000;
//when
HelloResponseDto dto = new HelloResponseDto(name,amount);
//then
assertThat(dto.getName()).isEqualTo(name); //1,2
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
테스트 통과라고 뜨니, 이제 responsedto를 사용하도록 hellocontroller에 코드 추가
@GetMapping("/hello/dto")
public HelloResponseDto helloResponseDto(@RequestParam("name") String name,
@RequestParam("amount") int amount){
return new HelloResponseDto(name,amount);
}
이제 dto가 잘 작동하는지 테스트 봤음
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; // dto api
-> json 응답값을 필드별로 검증할 수 있는 메소드
-> $를 기준으로 필드명을 명시
@Test
public void helloDto_is_returned() throws Exception {
String name = "hello";
int amount = 1000;
mvc.perform(
get("/hello/dto")
.param("name", name) //1
.param("amount", String.valueOf(amount)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name)))
.andExpect(jsonPath("$.amount",is(amount)));
기존 HelloControllerTest에다가 코드를 추가
json이 리턴되는 테스트가 성공적으로 완료됨
'프로젝트 > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스_실습' 카테고리의 다른 글
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 06 (0) | 2023.08.13 |
---|---|
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 05 (0) | 2023.08.12 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 03 (0) | 2023.08.10 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 02 (0) | 2023.08.09 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 01 (0) | 2023.08.08 |