Checked Exception을 테스트할 때, 하나의 함수만 호출해야 합니다.

 

코드에서 발생할 수 있는 예외를 검증할 때, 모범 사례는 테스트 코드에서 여러 개의 함수 호출을 피하고 무엇이 테스트돼야 하는지 명확히 하는 것 입니다.

두개의 함수가 같은 checked exception을 일으킬 수 있을 때, 정말로 테스트하고자 하는 것이 무엇인지 알 수 없기 때문에 이 모범 사례를 존중하지 않는 것은 버그입니다.

테스트 코드에서 오직 하나의 함수만이 예상되는 checked exception을 일으키도록 해야합니다.

규칙을 어긴 코드

@Test
public void testG() {
    // g() 또는 f() 함수 중 하나가 예외를 던질 것이라고 예상하십니까?
    assertThrows(IOException.class, () -> g(f(1)) ); // 규칙을 어긴 코드
}

@Test
public void testGTryCatchIdiom() {
    try { // 규칙을 어긴 코드
        g(f(1));
        Assert.fail("Expected an IOException to be thrown");
    } catch (IOException e) {
        // Test exception message...
    }
}

int f(int x) throws IOException {
    // ...
}

int g(int x) throws IOException {
    // ...
}

규칙을 준수한 해결책

@Test
public void testG() {
    int y = f(1);
    // f() 함수가 아닌 g() 함수로부터 예외가 발생할 것이라고 명시하고 있습니다.
    assertThrows(IOException.class, () -> g(y) );
}

@Test
public void testGTryCatchIdiom() {
    int y = f(1);
    try {
        g(y);
        Assert.fail("Expected an IOException to be thrown");
    } catch (IOException e) {
        // Test exception message...
    }
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project