본문 바로가기

Spring Boot

[SpringBoot] 테스트 코드 가독성 높이기 - BDDMockito, assertj

출처 : https://gracefulsoul.github.io/cs/bdd/

📌 테스트 코드 가독성 높이기 - BDD 적용


💡 BDD
Behavior-Driven Development(행위 주도 개발) 의 약자
이를 테스트에 적용시키면, 
테스트 대상의 상태의 변화를 시나리오(given-when-then)을 기반으로 테스트하는 방법

💡 BDDMockito
테스트 코드가 시나리오(given-when-then)에 맞게 읽히도록 개선된 Mockito Framwork
Mockito를 상속하며, 기능도 동일하지만
BDD 구조로 쉽게 읽힐 수 있도록 도와주는 것

💡 Mockito -> BDDMockito
① when을 given으로
Mockito 코드에서는 메서드와 그 행동을 설정할 때 when을 이용함
하지만 이 부분은 시나리오 상 given에 해당하므로 
BDDMockito에서는 네이밍을 given으로 변경

// Mockito
when(accountRepository.save(account)).thenReturn(returnsFirstArg());

// BDDMockito
given(accountRepository.save(account)).thenReturn(returnsFirstArg());

 

② verify를 then should로
Mockito 코드에서는 특정 함수가 실횅되었는지 테스트하기 위해 verify를 이용함
하지만 then에 해당함을 명시하며, 더 자연어처럼 읽히게 하기 위해
BDDMockito에서는 then should로 네이밍 변경

// Mockito
verify(accountRepository, times(1)).save(account);

// BDDMockito
then(accountRepository).should(times(1)).save(account);

 

📌 테스트 코드 가독성 높이기 - JUnit의 assertThat보다 assertj의 assertThat를 사용


💡 JUnit의 assertThat
JUnit의 assertThat은 두개의 인자가 필요함

1. 검증 대상(로직의 결과) 2. 비교 대상(matcher)
e.g assertThat(result, greaterThan(0));
=> 이는 가독성이 좋지 않음
또한, 두번째 인자인 matcher가 자동완성되지 않으므로 메소드를 외워둬야 함

💡 assertj의 assertThat
반면 assertj의 assertThat은 인자로 검증 대상만 넣어주면 됨
그리고 검증하기 위해서는 메소드 체이닝 패턴을 사용 => 자동완성 지원

// JUnit
assertEquals(12L, accountDto.getUserId());

// assertj
assertThat(accountDto.getUserId())
	.isEqualsTo(12L);

 

참고 블로그 : https://jwkim96.tistory.com/168

 

[Java] JUnit의 assertThat보다 assertj의 assertThat을 써야하는 이유

이 글은 JUnit4를 기준으로 작성되었습니다. 테스트 코드를 작성할 때, 크게 두 부분으로 나누어서 생각할 수 있습니다. 1. 실행 단계 2. 검증 단계 실행 단계에서는 사용자 입력을 모방하여 테스트

jwkim96.tistory.com