일본에서 일하는 외노자 로써 내용이 일본어가 포함될 수 있습니다.
Junit에 대해서 공부공부..
Test본코드는 전 게시물을 확인해주시기 바랍니다.
https://seodev.tistory.com/m/2
bookList 테스트
// 2. book リスト
@Test
public void bookList_test() {
//given
String title = "junit";
String author = "coding";
//when
List<Book> booksPS = bookRepository.findAll();
//then
assertEquals(title , booksPS.get(0).getTitle());
assertEquals(author, booksPS.get(0).getAuthor());
}
등록된 데이터를 리스트로써 전체 검색하기 위한 테스트
findAll()메서드는 한 개의 데이터만을 가져오는 것이 아닌 리스트로써
값을 가져오기 때문에 리스트를 이용해서 값을 가져온다.
List<Book> booksPS = bookRepository.findAll();
// then
assertEquals 를 이용해서 title과 bookPS.get(0).getTitle());
비교해준다. get(0); 는 인덱스 번호 0번을 가져온다. 그러고 getTitle메서드를 이용해서 인덱스 0번의 데이터의 Title을 가져온다.
** 위에는 bookPS에 값이 들어간 데이터가 없지만, 전 게시글에서 BeforeEach 를 이용해서 이미 값을 설정한 상태이다.
book 상세 화면 (1개 검색하기 )
// 3. book 詳細画面
@Sql("classpath:db/tableInit.sql")
@Test
public void bookSearch_test() {
//given
String title = "junit";
String author = "coding";
//when
Book bookPS = bookRepository.findById(1L).get();
//then
assertEquals(title, bookPS.getTitle());
assertEquals(author, bookPS.getAuthor());
// System.out.println(bookPS.getTitle());
}
아마 여기서 @Sql("classpath:db/tableInit.sql") 라는 것이 눈에 띄일 것이다.
한번 알아보도록 하자....
먼저 정의로는
@Sql
테스트 클래스나 테스트 매서드에 부착하는 애너테이션이며, 지정된 특정 SQL 스크립트 혹은 Statement를 수행시킨다. 통합 테스트에서 편리하게 DB 스키마 생성과 초기 데이터 삽입 및 데이터 초기화 등을 수행할 수 있다.
대부분 테스트 독립성을 위해 데이터 초기화 용도로 사용된다. 매번 새로운 컨텍스트를 생성하는 @DirtiesContext를 사용하기 곤란한 경우 사용해보자!
=> 즉, 통합테스트에서 트랜잭션에 의한 데이터가 초기화가 안될 수 있으니, 이 애노테이션을 사용해서 강제로 테스트를 진행할 때 마다 데이터 초기화를 진행할 수 있게 해준다. (테스트 독립성)
@Sql("classpath:db/tableInit.sql") 여기에 등록된 코드는 하기를 보길 바란다.
저장장소 : src/main/resources/db/tableinit.sql
drop table if exists Book;
create table Book (
id bigint generated by default as identity,
author varchar(20) not null,
title varchar(50) not null,
primary key (id)
);
매번 코드를 실행할 때마다 콘솔에서 나오는 글이다.
drop을 실행시켜 테이블을 삭제하고 다시 create를 이용해서 테이블을 생성한다.
중요 메타코딩님 말씀으로는 테스트 진행 시 findById()메서드를 이용할 시 사용하면 좋다고 했다.
하지만 실무에선 findById를 되도록이면 사용하지 않을 것을 권장 하셨다.
다시 본론으로 돌아가서 when 과 then 을 해석해보자.
//when
Book bookPS = bookRepository.findById(1L).get();
1L 로 되어 있는 것은 1Long이다. 첫번째 데이터를 가져와서 bookPS에 저장한다.
이것은 id의 데이터형식이 Long 으로 되어있기 때문이다.
then에 대해서는 똑같이 비교이므로 패스 하도록 하겠다.
book 삭제
// 4. book 削除
@Sql("classpath:db/tableInit.sql")
@Test
public void book_delete_test() {
//given
Long id = 1L;
//when
bookRepository.deleteById(id);
//then
// Optional<Book> bookPS = bookRepository.findById(id);
assertFalse(bookRepository.findById(id).isPresent());
}
어김없이 Sql이 등장 하였다.
처음에 이것을 등록하지 않아서 꽤 애먹었다. ...
book삭제에서도 deleteById인 id를 이용하는 것이라서 꼭 @Sql을 붙여주길 바란다.
새롭게 등장하는 isPresent()
먼저 정의를 알아보자...
isPresent()
Optional.ifPresent() 본래 이렇게 쓰인다. 데이터 형식이 Optional인 ById는 이 메서드를 이용해서
값이 존재하는 경우 true, 존재하지 않는 경우 false를 반환하는 메서드입니다.
그 외에도 알아보자
ifPresent()
Optional.ifPresent()는 값이 존재하는 경우 인수로 지정된 함수(Consumer)를 실행하는 메서드입니다.
ifPresentOrElse()
Optional.ifPresentOrElse()는, 값이 존재하는 경우는 인수로 지정한 1 번째의 함수 (Consumer)를 실행해, 존재하지 않는 경우는 인수로 지정한 2 번째째의 함수 (Runnable)를 실행하는 메소드입니다.
아! .. 그리고 assertEquals가 아닌 assertFalse이다. 이것은 검사했을 시 검증이 다른 경우 junit에서 통과해준다.
그렇기에 상기의 코드의 해석은 findById(id)에서 아이디를 검색 했는데 isPresent로 검색했는 데 없으니 false를 반환하고 이 반환된 값이 assertFalse에서 값이 false 이니 junit 테스트 통과를 하게 된다.
book 수정
// 5. book 修正
@Sql("classpath:db/tableInit.sql")
@Test
public void book_修正_test() {
//given
Long id = 1L;
String title = "new_junit";
String author = "new_coding";
Book book = new Book(id, title, author);
//when
Book bookPS = bookRepository.save(book);
//then
assertEquals(id, bookPS.getId());
assertEquals(title, bookPS.getTitle());
assertEquals(author, bookPS.getAuthor());
}
마지막 test이다.
BeforeEach로 기존의 값을 받고 있는 상태이고, 새롭게 given을 통해서
book객체를 새롭게 만들었다.
when을 통해서 bookPS에 방금 만든 book 객체를 save메서드를 이용해서 데이터 갱신을 한다.
save메서드는 JPA를 이용하고 있어, 따로 repository에 메서드를 작성하지 않아도 기본으로 되어있는 메서드 이다.
그러면 이제 then 검증을 해볼 차례이다.
.... 해보려고 했지만, 기존과 똑같다. 방금 book에 만든 id와 bookPS에 집어넣은 id가 값이 같는지 확인하는 작업이다.
이상!!
다음은 Service 차례입니다.!! 공부를 계속 해보도록 하겠습니다.
'개발 > Junit' 카테고리의 다른 글
⑥Service Junit 테스트 - 4 검색 수정 junit테스트 (0) | 2022.10.20 |
---|---|
⑤Service Junit 테스트 - 3 등록과 리스트 junit테스트 (0) | 2022.10.19 |
④Junit Service 테스트 -2 Service book List, Search (0) | 2022.10.19 |
③Junit Service 테스트 -1 Service book등록 (0) | 2022.10.18 |
①Junit 에 대해서 공부하자.! Junit BookRepositoryTest (0) | 2022.10.18 |
댓글