스프링 테스트 코드 메모장

장원재·2024년 3월 18일
0

스프링

목록 보기
7/9

contains (assertj)

스프링에서 테스트 코드를 작성할 때 이러한 상황이 발생할 수 있다. BoardRepository 라는 @Repository 계층에서 데이터를 2개 저장을 한다. 그리고 이 둘을 하나씩 조회를 하고 엔티티 객체로 담아둔 후에, 모든 데이터를 조회한다. 그러면 모든 데이터를 조회한 list<엔티티>가 하나씩 조회한 엔티티를 포함한다 라는식의 테스트 코드를 작성을 한다고 할때, contains를 활용하면 된다. 그런데 그냥 사용하면 적용되질 않는다. 왜냐하면 모든 데이터를 담고 있는 list<엔티티>와 하나씩 조회한 엔티티의 참조 값이 다르기 때문이다. 결론적으로는 해당 엔티티에 equals hashcode를 오버라이드 해주면 해결된다.

  • Board 엔티티의 내부
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }
  • BoardRepositoryTest 코드 중 일부
    @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

결과로 가져온 객체 리스트에서 특정 필드 값이 어떠한 내용을 포함하고 있는지 확인하고자 한다면 extractingcontainsExactly를 함께 사용하도록 하자.

    @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에 해당하는 내용을 추출하는 것이다.
  • 그리고 추출한 username 이 순차적으로 member1, member2를 갖는다는 것이 containsExactly(..) 이다.

    containsExactly(..) 에 나오는 값들은 모두 순서가 정확하게 일치해야 한다

assertThatThrownBy (assertj)

어떠한 코드가 예외를 발생시킨다면 assertThatThrownBy 를 사용해서 테스트 코드를 작성하는 것을 고려해봐야 한다.

repository.delete(member.getMemberId());
assertThatThrownBy(() -> repository.findById(member.getMemberId()))
        .isInstanceOf(NoSuchElementException.class);
  • assertThatThrownBy 를 활용해서 repository.findById(member.getMemberId())를 실행했을 때 NoSuchElementException이 터진다 라는식의 테스트 코드 작성이 가능하다.

assertTrue (junit5)

해당 값이 참인지 여부를 확인할 때는 junit5의 assertTrue를 사용하자. (assertj 에서의 isTrue 옵션을 사용해도 무방)

assertTrue(memberRepository.find(username).isPresent());
assertTrue(logRepository.find(username).isEmpty());
  • 위 테스트 코드가 성공하려면 memberRepository 로 부터 찾은 데이터가 존재해야 하며, logRepository로 부터 찾은 데이터는 없어야 한다.

참고: memberRepository.find(username)logRepository.find(username) 의 결과는 Optional 이라서 값이 있는지 없는지에 대해서 isPresent, isEmpty 메서드의 사용을 함

profile
데이터 분석에 관심있는 백앤드 개발자 지망생입니다

0개의 댓글

관련 채용 정보