public static void com.github.sejoung.codetest.annotation.markerannotation.Sample.m3() 실패: java.lang.RuntimeException: 실패 잘못 사용한 @Test: public void com.github.sejoung.codetest.annotation.markerannotation.Sample.m5() public static void com.github.sejoung.codetest.annotation.markerannotation.Sample.m7() 실패: java.lang.RuntimeException: 실패 성공: 1, 실패: 3
테스트 public static void com.github.sejoung.codetest.annotation.annotationwithparameter.Sample2.m2() 실패: 기대한 예외 java.lang.ArithmeticException, 발생한 예외 java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 0 테스트 public static void com.github.sejoung.codetest.annotation.annotationwithparameter.Sample2.m3() 실패: 예외를 던지지 않음 성공: 1, 실패: 2
// 배열 매개변수를 받는 애너테이션을 사용하는 프로그램 (242-243쪽) publicclassSample3 { // 이 변형은 원소 하나짜리 매개변수를 받는 애너테이션도 처리할 수 있다. (241쪽 Sample2와 같음) @ExceptionTest(ArithmeticException.class) publicstaticvoidm1() { // 성공해야 한다. inti=0; i = i / i; } @ExceptionTest(ArithmeticException.class) publicstaticvoidm2() { // 실패해야 한다. (다른 예외 발생) int[] a = newint[0]; inti= a[1]; } @ExceptionTest(ArithmeticException.class) publicstaticvoidm3() { } // 실패해야 한다. (예외가 발생하지 않음)
// 코드 39-7 배열 매개변수를 받는 애너테이션을 사용하는 코드 (242-243쪽) @ExceptionTest({ IndexOutOfBoundsException.class, NullPointerException.class }) publicstaticvoiddoublyBad() { // 성공해야 한다. List<String> list = newArrayList<>();
// 자바 API 명세에 따르면 다음 메서드는 IndexOutOfBoundsException이나 // NullPointerException을 던질 수 있다. list.addAll(5, null); } }
publicclassRunTests { publicstaticvoidmain(String[] args)throws Exception { inttests=0; intpassed=0; Class<?> testClass = Sample3.class; for (Method m : testClass.getDeclaredMethods()) {
// 배열 매개변수를 받는 애너테이션을 처리하는 코드 (243쪽) if (m.isAnnotationPresent(ExceptionTest.class)) { tests++; try { m.invoke(null); System.out.printf("테스트 %s 실패: 예외를 던지지 않음%n", m); } catch (Throwable wrappedExc) { Throwableexc= wrappedExc.getCause(); intoldPassed= passed; Class<? extendsThrowable>[] excTypes = m.getAnnotation(ExceptionTest.class).value(); for (Class<? extendsThrowable> excType : excTypes) { if (excType.isInstance(exc)) { passed++; break; } } if (passed == oldPassed) System.out.printf("테스트 %s 실패: %s %n", m, exc); } } } System.out.printf("성공: %d, 실패: %d%n", passed, tests - passed); } }
실행결과
1 2 3 4 5 6 7
테스트 public static void com.github.sejoung.codetest.annotation.annotationwitharrayparameter.Sample3.m2() 실패: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 0 테스트 public static void com.github.sejoung.codetest.annotation.annotationwitharrayparameter.Sample3.m3() 실패: 예외를 던지지 않음 성공: 2, 실패: 2
// 반복 가능한 애너테이션을 사용한 프로그램 (244쪽) publicclassSample4 { @ExceptionTest(ArithmeticException.class) publicstaticvoidm1() { // 성공해야 한다. inti=0; i = i / i; }
@ExceptionTest(ArithmeticException.class) publicstaticvoidm2() { // 실패해야 한다. (다른 예외 발생) int[] a = newint[0]; inti= a[1]; }
@ExceptionTest(ArithmeticException.class) publicstaticvoidm3() { } // 실패해야 한다. (예외가 발생하지 않음)
// 코드 39-9 반복 가능 애너테이션을 두 번 단 코드 (244쪽) @ExceptionTest(IndexOutOfBoundsException.class) @ExceptionTest(NullPointerException.class) publicstaticvoiddoublyBad() { List<String> list = newArrayList<>();
// 자바 API 명세에 따르면 다음 메서드는 IndexOutOfBoundsException이나 // NullPointerException을 던질 수 있다. list.addAll(5, null); } }
// 마커 애너테이션과 반복 가능 애너테이션을 처리하는 프로그램 (244-245쪽) publicclassRunTests { publicstaticvoidmain(String[] args)throws Exception { inttests=0; intpassed=0; ClasstestClass= Sample4.class; for (Method m : testClass.getDeclaredMethods()) {
테스트 public static void com.github.sejoung.codetest.annotation.repeatableannotation.Sample4.m2() 실패: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 0 테스트 public static void com.github.sejoung.codetest.annotation.repeatableannotation.Sample4.m3() 실패: 예외를 던지지 않음 성공: 2, 실패: 2