스프링에서 테스트 코드를 작성할 때 이러한 상황이 발생할 수 있다. BoardRepository 라는 @Repository
계층에서 데이터를 2개 저장을 한다. 그리고 이 둘을 하나씩 조회를 하고 엔티티 객체로 담아둔 후에, 모든 데이터를 조회한다. 그러면 모든 데이터를 조회한 list<엔티티>가 하나씩 조회한 엔티티를 포함한다 라는식의 테스트 코드를 작성을 한다고 할때, contains를 활용하면 된다. 그런데 그냥 사용하면 적용되질 않는다. 왜냐하면 모든 데이터를 담고 있는 list<엔티티>와 하나씩 조회한 엔티티의 참조 값이 다르기 때문이다. 결론적으로는 해당 엔티티에 equals hashcode를 오버라이드 해주면 해결된다.
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Test
void 모든_게시판_조회() throws Exception {
//given
Board board1 = new Board();
board1.setTitle("board1");
board1.setContent("content1");
Board board2 = new Board();
board2.setTitle("board2");
board2.setContent("content2");
//when
boardRepository.save(board1);
boardRepository.save(board2);
//then
List<Board> boards = boardRepository.findAll();
assertThat(boards.size()).isEqualTo(2);
assertThat(boards).contains(board1, board2); //요기
}
assertThat(boards).contains(board1, board2)
이다. 이 부분은 board 엔티티에서 equals hascode 를 해야만 적용이 된다.결과로 가져온 객체 리스트에서 특정 필드 값이 어떠한 내용을 포함하고 있는지 확인하고자 한다면 extracting
과 containsExactly
를 함께 사용하도록 하자.
@Test
void join() {
List<Member> result = queryFactory
.selectFrom(member)
.join(member.team, team)
.where(team.name.eq("teamA"))
.fetch();
assertThat(result)
.extracting("username")
.containsExactly("member1", "member2");
}
extracting("username")
는 List<Member>
에서 Member
객체의 필드인 username에 해당하는 내용을 추출하는 것이다. containsExactly(..)
이다.
containsExactly(..)
에 나오는 값들은 모두 순서가 정확하게 일치해야 한다
어떠한 코드가 예외를 발생시킨다면 assertThatThrownBy
를 사용해서 테스트 코드를 작성하는 것을 고려해봐야 한다.
repository.delete(member.getMemberId());
assertThatThrownBy(() -> repository.findById(member.getMemberId()))
.isInstanceOf(NoSuchElementException.class);
assertThatThrownBy
를 활용해서 repository.findById(member.getMemberId())
를 실행했을 때 NoSuchElementException
이 터진다 라는식의 테스트 코드 작성이 가능하다. 해당 값이 참인지 여부를 확인할 때는 junit5의 assertTrue를 사용하자. (assertj 에서의 isTrue 옵션을 사용해도 무방)
assertTrue(memberRepository.find(username).isPresent());
assertTrue(logRepository.find(username).isEmpty());
참고:
memberRepository.find(username)
와logRepository.find(username)
의 결과는 Optional 이라서 값이 있는지 없는지에 대해서isPresent
,isEmpty
메서드의 사용을 함