호환되지 않는 타입을 비교하는 Assertions
는 항상 실패합니다. 그리고 negative assertions
는 항상 통과합니다. 최악의 경우, 개발자는 잘못된 assertion
을 알아차리기 전에 코드 논리를 수정하는 데 시간을 낭비합니다.
호환되지 않는 타입은 다음과 같습니다:
- primitive 타입을 null과 비교
- 객체를 관련없는 primitive 타입과 비교
- 관련 없는 클래스들 간 비교
- array와 non-array 간 비교
- 서로 다른 유형의 두 array 간 비교
이 룰은 negative assertions
에서 서로 관련 없는 클래스와 인터페이스 또는 관련 없는 인터페이스 타입들에 대해 알려줍니다. 왜냐하면 일부 코너 케이스를 제외하고는 타입이 서로 다를 가능성이 더 높기 때문입니다. 그리고 negative assertion
내부에는 이 비정상적인 비교를 하는 테스트에 대해 개발자에게 알려줄 수 없습니다. (^역: negative aseertion
는 항상 통과하기 때문입니다.)
지원하는 테스트 프레임워크:
- JUnit4
- JUnit5
- AssertJ
규칙을 어긴 코드
interface KitchenTool {}
interface Plant {}
class Spatula implements KitchenTool {}
class Tree implements Plant {}
void assertValues(
int size, Spatula spatula, KitchenTool tool, KitchenTool[] tools,
Tree tree, Plant plant, Tree[] trees) {
// 주어진 값이 무엇이든, 이러한 negative assertions는 항상 다른 타입으로 인해 통과됩니다:
assertThat(size).isNotNull(); // 규칙을 어긴 코드; primitives 타입은 null일 수 없습니다.
assertThat(spatula).isNotEqualTo(tree); // 규칙을 어긴 코드; 관련 없는 클래스들
assertThat(tool).isNotSameAs(tools); // 규칙을 어긴 코드; array & non-array
assertThat(trees).isNotEqualTo(tools); // 규칙을 어긴 코드; 호환되지 않는 배열들
// 이러한 assertions는 항상 실패합니다.
assertThat(size).isNull(); // 규칙을 어긴 코드
assertThat(spatula).isEqualTo(tree); // 규칙을 어긴 코드
// 이러한 nagative assertions는 항상 통과될 가능성이 높습니다.
assertThat(spatula).isNotEqualTo(plant); // 규칙을 어긴 코드; 관련 없는 클래스와 인터페이스
assertThat(tool).isNotEqualTo(plant); // 규칙을 어긴 코드; 관련 없는 인터페이스들
}
같이보면 좋은 자료
- {rule:java:S2159} - Silly equality checks should not be made
If you like SONARKUBE, don’t forget to give me a star.