본문 바로가기
개발/Junit

⑨Junit Controller Test 초기설정 및 BookSave Test

by 외노자개발 2022. 10. 22.
반응형

이제부턴 Controller의 테스트를 진행해보겠습니다. 

 

BookApiController 초기설정 

//総合テスト
@ActiveProfiles("dev")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class BookApiControllerTest {

	@Autowired
	private TestRestTemplate rt;
	
	@Autowired
	private BookRepository bookRepository;
	
	private static ObjectMapper om;
	private static HttpHeaders headers;
	
	@BeforeAll
	public static void init() {
		om = new ObjectMapper();
		headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);
	}
	
	@BeforeEach //各テスト以前に実行
	public void dataSetting() {
		String title = "junit";
		String author = "coding";
		Book book = Book.builder()
				.title(title)
				.author(author)
				.build();
		bookRepository.save(book);
	}

먼저 어노테이션 등등 정의부터 알아가겠습니다. 

@ActiveProfiles // 환경에 따라 빈과 프로퍼티들을 따로따로 설정해주기 위해 사용한다. 지금 사용하고 있는 경우는 ("dev")로써 개발 환경을 이용할때 사용하고 있다. 

@SpringBootTest // 먼저 이것은 WebMvcTest도 알고 있어야 한다 이 두 개를 알아보자

@WebMvcTest

Controller 계층만을 테스트 하기 위해 사용 전체 APP을 실행시키는 것이 아닌 Controller만을 테스트

@SpringBootTest

통합 테스트를 진행한다. 실제 어플리케이션과 똑같이 기동되며 단위테스트보다는 시간이 더 걸리지만, 디버깅을 찾을때도 좋다.

그리고 webEnvironment = webEnvironment.RANDOM_PORT는 내장 톰캣을 사용한다는 것.

@Autowired // MVC에서 처음부터 배운다! 의존성을 주입하기 위한 어노테이션이다. 

@BeforeAll // 테스트를 하기 전 딱 한번 실행해준다. (static으로 작성)

@BeforeEach // 각 @Test를 실행하기 전 매번 실행 해준다.

ObjectMapper // JSON의 데이터를 Java 객체로 , Java객체를 JSON으로 바꿔준다. 

HttpHeaders // http header는 HttpHeaders에 설정하고, HttpEntity에 body와 header를 설정한다. 

헤더는 요청/응답 요구사항

HttpEntity에 대해서도 나중에 나온다. HttpEntity는 HttpHeader와 HttpBody를 포함하는 클래스이다.

body 에는 내용이 들어있다. 

 

HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다. 따라서 ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다. 

이것은 우선 이렇게만 알아 놓자.

여기서 다루는 RestTemplate는 나중에 더 자세히 다루도록 하겠다. 

 

 

 

이제 코드를 해석해보자. 

DI를 TestRestTamplate(테스트 하기 위해서 사용 WebEnvironment가 되어있어야 한다.! ) 주입 그리고 BookRepository도 주입해준다.  변수 ObjectMapper와 HttpHeaders 를 정의해준다. 

@BeforeAll // 을 테스트 전에 실행 static을 해준 이유는  ObjectMapper변수가 static이기 때문! 

om과 header를 설정을 해준다.

@beforeEach // 로 각 테스트 전 설정을 해준다. 내용은

title, author을 설정 후 book을 builder bookRepository에  save를 해준다.! 

 


이제부터 테스트를 진행해보겠다. 

먼저

1. saveBook_test

	@Test
	public void saveBook_test() throws Exception {
		//given
		BookSaveReqDto bookSaveReqDto = new BookSaveReqDto();
		bookSaveReqDto.setTitle("spring1");
		bookSaveReqDto.setAuthor("get-in11");
		
		String body = om.writeValueAsString(bookSaveReqDto);
		
		//when
		HttpEntity<String> request = new HttpEntity<>(body, headers);
		ResponseEntity<String> response = rt.exchange("/api/v1/book", HttpMethod.POST, request,  String.class);
//		System.out.println(response.getBody());
		
		//then
		DocumentContext dc = JsonPath.parse(response.getBody());
		String title = dc.read("$.body.title");
		String author = dc.read("$.body.author");
		
		assertThat(title).isEqualTo("spring1");
		assertThat(author).isEqualTo("get-in11");
	}

먼저 메서드를 알아보자!

writeValueAsString // Java객체를 JSON형태로 변환 ,, 반대로 readValue를 해주면 java객체로 변환해서 읽어준다.

HttpEntity<String> // 한번 더 적자면 body와 HttpHeaders를 값을 담아준다. ResponseEntity<String> // HttpStatus HttpHeaders HttpBody 응답데이터를 포함한 클래스이다. rt.exchange // rt는 RestTemplagte 로써 exchange를 하게 되면 다음 인수를 설정 할 수있다. 대상 URL(String), 요청메서드(HttpMethod), 요청정보(HttpEntity<T>), 응답유형(Class<T>)

rt.exchange("/api/v1/book", HttpMethod.POST, request,  String.class);

DocumentContext // JsonPath, String을 object로 변환하지 않고도 연산자 함수 표현식등의 기능을 수행가능하다.

dot표현식 $.body.title 등으로 표현이 가능하다. !! 

간단하게 알아보자! 

$: 루트 노드 모든 Path 를 이 기호로 시작 

@: 처리되고 있는 노드 , 필터조건자에서 사용

*: 와일드 카드 모든요소와 매칭

.: 자식노드 등등!! 

이젠!! 진짜 해석을 해보자.,,,

given // BookSaveReqDto를 가져와서 리퀘스트로 title과 Author을 set시킨다.

그리고 body변수에 ObjectMapper의 writeValueAsString(bookSaveReqDto)에 데이터를 JSON형태로 넣어준다. 

 

when // HttpEntity<String> 제네릭을 String으로 한 것은 body, headers모두 String이기 때문!

request변수에 body, headers를 넣어준다. 실제 body에는 상기의 given에서 설정한 값이 들어있고, 

headers는 @beforeAll에서 설정한 값이 들어가 있다. 

ResponseEntity<String>에서는 대상URL값과 httpMethod인 북등록할때 필요한 POST값과 request, 응답유형을 설정해준다. 

 

then // JsonPath를 이용해서 reponse.getBody()해서 body에서 title과 author를 가져와서 저장한다. 

그것을 asserThat으로 비교해준다. 

 

이상!!

조금 길어져서 다음 글에서 이어서 쓰겠슴다!! 

 

반응형

댓글