동등성을 비교하여 올바른 DTO가 반환되었는지 확인 해보자
DTO의 경우 VO와 다르게 동등성을 비교하는 메소드를 오버라이딩 하지 않습니다.
- Junit5
- AssertJ
1 |
|
Goal
- 동일성이 아닌 동등성을 비교하는 테스트 코드를 작성해 본다.
동일성 vs 동등성
완전히 같으냐?, 값만 같으냐?
동일성
- 동일성의 경우에는 완전히 같은 객체인지를 확인 한다.
- 돈을 예시로 들때 1만원짜리 지폐가 있다면, 1만원 값이 같고 일련번호까지 완전히 같은 지폐가 동일한 지폐로 판단한다.
- 동일성을 비교하는 방법은 일반적으로 java 기준
equals
,hashCode
를 오버라이딩 하여 구현한다.
동등성
- 동등성의 경우에는 보유하고 있는 값이 같은지를 확인 한다.
- 1만원짜리 지폐가 있다면, 일련번호가 달라도 같은 1만원이라면 같은 지폐로 판단한다.
- 동일성이 만족되었다면, 동등성역시 같이 만족되었다고 볼 수 있다.
usingRecursiveComparison()
AssertJ
- VO가 아닌것들을 대상으로 테스트 코드를 짤때, 동일성 비교가 아닌 동등성을 비교하고 싶다.
usingRecursiveComparison()
와 같은 아주 좋은 메소드가 있다.- 내부 값만 같으면 테스트를 통과한다!
- DTO와 같은 것을 비교할때 아주 용이하다.
- 내부적으로 모든값을 재귀적으로 돌면서 확인해준다.
코드1
1 |
|
1 |
|
코드2
1 |
|
usingRecursiveFieldByFieldElementComparator
- 응용하면 아래와 같이 작성할 수 있다.
usingRecursiveFieldByFieldElementComparator()
와contains
를 사용해- 순서와 상관없이 안의 값중 동등한것이 한개라도 있는지 확인할 수 있다.
코드
1 |
|
Recursive 특정 필드값 무시
- 동등성을 비교할때, 특정 필드값은 제외하면서 비교, 확인할 수 있다.
1 |
|
과 같은 형태에서 몇개의 필드들은 무시하며 동등성을 확인하고 싶으면
1 |
|
와 같은 형태로 특정 필드들을 무시하며 동등성을 비교할 수 있다.
Reference
- https://assertj.github.io/doc/#assertj-core-recursive-comparison
- https://stackoverflow.com/questions/43316133/how-to-compare-recursively-ignoring-given-fields-using-assertj
- https://www.podo-dev.com/blogs/232