Optional 테스트

김휘진·2023년 4월 21일
1

Java

목록 보기
4/5

Optional객체를 테스트할 때

@Test
void login() {
    
	//given
	MemberDto member = MemberDto.builder()
                .memberId("ex12")
                .pw("1234")
                .name("홍길동")
                .gender("남자")
                .email("ex123@naver.com")
                .build();
	mapper.join(member);

	//when
	Optional<MemberDto> loginMember = service.login("ex12", "1234");

	//then
	assertThat(loginMember).isEqualTo(member);
	System.out.println("loginMember = " + loginMember);
}

MemberService의 login() Test

테스트는 given, when, then 기법으로 진행했다.

given

  • memberId가 "ex12"인 회원을 회원가입

  • mapper.join(member) : member객체를 DB에 저장해주는 메소드

when

  • service.login 테스트를 위해 회원가입한 member의 id와 pw를 Parameter로 받는다.

  • 리턴 값을 loginMember라는 변수에 넣어준다.

  • 이 때 loginMember는 login() 메소드가 id 또는 pw가 틀리거나 없을 경우, null을 반환하기 때문에 Optional로 감싸준다.

then

  • assertJ라이브러리를 사용해 회원가입한 member와 loginMember가 같은지 비교를 했다.

service.login()메소드가 정상적으로 잘 작성된 코드라면 오류없이 잘 작동해야 한다.

org.opentest4j.AssertionFailedError

오류가 떴다.
분명 코드는 잘 작성한 것 같은데.. 오류내용을 살펴보자!

보면 예상된 값이랑 실제값이랑 회원정보는 똑같다.
근데 왜 다르다고 하는 것일까..?

Expected와 Actual이 보다보니까 서로 어딘가 살짝 다른게 보인다.
바로 Actual값 앞에만 Optional이 있는 것을 볼 수 있다.

결국 Actual : Optional[MemberDto(...)] 이렇게 감싸져있기 때문에 비교했을 때

MemberDto() != Optional[MemberDto(...)]

서로 다르다고 인식하고 error를 띄우는 것이다.

그래서 필자는 이 방법을 모를 때에는 내부의 name이라던가 필드 값을 따로 꺼내서 서로 비교해주는 더 번거로운 방법을 사용했었다.

기존에 Optional을 비교하던 방법

assertThat(loginMember.get().getName()).isEqualTo("홍길동");

간단한 Optional객체 비교방법

허나 더 간단하고 확실한 방법을 뒤늦게야 알았는데 예전에 구글링을 했을 때에는 왜 못찾았었는지는 모르겠다.
아마도 내 구글링 실력의 부족이었을 것이다.

assertThat(loginMember).isEqualTo(Optional.of(member));

더 간단하고 코드도 간결해진 것을 볼 수 있다.
그렇다면 실행해도 문제가 없는지 확인해보자

잘 작동되는 것을 볼 수 있다.

Optional객체는 앞으로 비교할 때 Optional.of()로 비교하자!

profile
Don't give up, I can do (IT)

0개의 댓글