테스트 케이스 공부하면서 배운 점 두서 없이 정리하기
오늘은 5번 내용과 관련해서 부연설명 달아놓은 부분을 해결하는 방법을 나누고자 합니다.
(물론 영한님의 지식을 나누는 것 헿)
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("seungho");
Member member2 = new Member();
member2.setName("yujin");
memberRepository.save(member1);
memberRepository.save(member2);
Member result1 = memberRepository.findByName(member1.getName()).get();
Member result2 = memberRepository.findByName(member2.getName()).get();
Assertions.assertThat(member1).isEqualTo(result1);
Assertions.assertThat(member2).isEqualTo(result2);
Assertions.assertThat(member1.getName()).isEqualTo(result1.getName());
}
@Test
public void findAll(){
Member member1 = new Member();
Member member2 = new Member();
Member member3 = new Member();
member1.setName("seungho");
member2.setName("yujin");
member3.setName("dongdong");
memberRepository.save((member1));
memberRepository.save((member2));
memberRepository.save((member3));
List<Member> results = (List<Member>)memberRepository.findAll();
Assertions.assertThat(results.size()).isEqualTo(3);
Member testMember = results.stream().
filter(member -> member.getName().
equals("yujin")).findAny().get();
Assertions.assertThat(testMember.getName()).isEqualTo("yujin");
}
위의 findByName() 과 아래의 findAll()에서 테스트로 넣은 name데이터가 겹치는 것이 있습니다.
그로 인한 결과는
이렇게 기댓값과 실제값이 다르다는 에러를 뿜습니다.
데이터 중복으로 어떤 놈을 불러야 하는지 스프링도 헷갈리는 것이죠.
매 테스트 케이스가 끝날 때마다 데이터를 초기화 시켜주면 되지 않을까?
넵 그럼 됩니다.
생각보다 간단했습니다.
@AfterEach 어노테이션을 활용하면 테스트 케이스 하나하나가 끝날 때마다 개발자가 의도한 내용을 실행시켜주게끔 할 수 있습니다.
1.인터페이스에 추가(물론 repository라는 일관성에 맞지 않는다고 생각하면 다른 클래스에 작성해도 무방)👇
2.구현하는 클래스에서 map 함수인 clear 사용👇
3.@AfterEach를 구현하여 테스트케이스 끝날 때 마다 정보 초기화 진행👇
이렇게 하면 맘 편히 중복되는 데이터를 넣어도 에러가 나지 않고 테스트 진행 가능하게 됩니다!
끝
참고