문제

단일 주니트 장치 테스트에서 여러 예외를 테스트 할 수 있습니까? 예를 들어 하나의 예외를 알고 있습니다. 예를 들어

    @Test(expected=IllegalStateException.class)

이제 다른 예외 (예 : NullPointerException)를 테스트하려면 동일한 주석, 다른 주석으로 수행 할 수 있습니까? 아니면 다른 단위 테스트를 완전히 작성해야합니까?

도움이 되었습니까?

해결책

당신은 정말로 테스트를 원합니다 하나 일, 그리고 그것을 테스트합니다. 어떤 예외가 발생할지 확실하지 않다면, 그것은 나에게 좋은 시험처럼 들리지 않습니다.

EG (의사 코드)

try {
   badOperation();
   /// looks like we succeeded. Not good! Fail the test
   fail();
}
catch (ExpectedException e) {
   // that's fine
}
catch (UnexpectedException e) {
   // that's NOT fine. Fail the test
}

따라서 메소드가 2 개의 다른 예외 (2 세트의 입력 세트)를 던지는 것을 테스트하려면 2 개의 테스트가 필요합니다.

다른 팁

이것은 주석에서는 불가능합니다.

Junit 4.7을 사용하면 새로운 것을 사용할 수 있습니다 ExpectedException 규칙

public static class HasExpectedException {
    @Interceptor
    public ExpectedException thrown= new ExpectedException();

    @Test
    public void throwsNothing() {
    }

    @Test
    public void throwsNullPointerException() {
         thrown.expect(NullPointerException.class);
         throw new NullPointerException();
    }

    @Test
    public void throwsNullPointerExceptionWithMessage() {
        thrown.expect(NullPointerException.class);
        thrown.expectMessage("happened?");
        throw new NullPointerException("What happened?");
    }
}

더보십시오


Junit 4.7로 업데이트가 불가능한 경우 양식의 베어 단위 테스트를 작성해야합니다.

public test() {
    try {
        methodCall(); // should throw Exception
        fail();
    }
    catch (Exception ex) {
        assert((ex instanceof A) || (ex instanceof B) || ...etc...);
        ...
    }

}

사용 캐치 노출:

// test 
public void testDo() {

   // obj.do(1) must throw either A or B
   catchException(obj).do(1);
   assert caughtException() instanceof A
       || caughtException() instanceof B;

   // obj.do(2) must throw A but not SubclassOfA
   catchException(obj).do(2);
   assert caughtException() instanceof A
       && !(caughtException() instanceof SubclassOfA);

}

Junit 4에서는 불가능하지만 ~이다 TestNG로 전환하면 쓸 수 있습니다.

@Test(expectedExceptions = {IllegalArgumentException.class, NullPointerException.class})

당신은 어떻게 "예상"S가 작동하기를 기대 하시겠습니까? 메소드는 하나의 예외 만 던질 수 있습니다.

방법이 실패 할 수있는 각 방법에 대해 다른 단위 테스트를 작성해야합니다. 따라서이 방법이 합법적으로 두 가지 예외를 던지면 각 예외를 던지는 방법을 강제하기 위해 두 개의 테스트를 설정해야합니다.

시험을 가능한 한 간단하고 짧게 유지하십시오. 주니트 테스트의 의도는 하나의 간단한 기능 또는 단일 실패 방법 만 테스트하는 것입니다.

실제로 안전을 위해서는 가능한 모든 실행 방식에 대해 하나 이상의 테스트를 만들어야합니다.

일반적으로 문자열을 분석하는 메소드가 있으면 모든 것을 다룰 수없는 많은 문자열 조합이 있기 때문에 항상 가능하지는 않습니다.

짧고 간단하게 유지하십시오.

하나의 단일 방법에 대한 30-40 테스트 방법을 쉽게 가질 수 있습니다 ... 실제로 중요합니까?

문안 인사

@Test(expected=Exception.class)

이것은 가능한 모든 예외를 던질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top