TypeNotPresentExceptionProxy

При обновлении с Surefire 2.6 до Surefire 2.13 я получаю TypeNotPresentExceptionProxy при выполнении моих модульных тестов.

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
    at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:653)
    at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:460)
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:286)
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:222)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52)
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3070)
    at java.lang.Class.getAnnotation(Class.java:3029)
    at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.isValidJUnit4Test(JUnit4TestChecker.java:64)

В JUnit4TestChecker строка 64 выглядит так:

Annotation runWithAnnotation = testClass.getAnnotation( runWith );

Итак, Surefire проверяет аннотацию @RunWith, чтобы убедиться, что ее тип действителен. Наши тесты используют Spring, поэтому @RunWith выглядит так в наших тестовых классах:

@RunWith(SpringJUnit4ClassRunner.class)

Кажется, что Surefire не находит класс SpringJUnit4ClassRunner. Я не уверен, почему, поскольку в Surefire 2.6 тесты проходят нормально.

Любые идеи?

Ответ 1

Запустить mvn зависимость: разрешить

Исключить любую версию JUnit 3.x, которая, возможно, закралась.

Убедитесь, что нет зависимостей TestNG, если они будут загружать аннотации TestNG, а не требуемые JUnit.

Ответ 2

Ошибка TypeNotPresentExceptionProxy не является определенной для конкретной зависимости и зависит от каждого пути к классам проекта. Итак, проверьте ваше дерево зависимостей maven. Например, однажды я попал в эту ошибку, когда у меня было две зависимости junit, поэтому в classpath было две версии аннотаций Junit.

Вы можете установить точку останова в некоторых методах класса "java.lang.Class":

Например:

java.lang.Class.getAnnotation 
java.lang.Class.getAnnotations 

После этого вы сможете выяснить, с каким классом возникает проблема... найдите внутри класса аннотации и проверьте путь к классам на предмет неясностей.