호환되지 않는 타입을 비교하는 `Assertions`을 생성하면 안됩니다.

 

호환되지 않는 타입을 비교하는 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. :star2:

원문으로 바로가기

Star This Project