TypeNotPresentExceptionProxy

Posted

技术标签:

【中文标题】TypeNotPresentExceptionProxy【英文标题】: 【发布时间】:2013-01-17 08:52:57 【问题描述】:

从 Surefire 2.6 升级到 Surefire 2.13 时,我在运行单元测试时收到

java.lang.ArrayStoreException: sun.reflect.annotation.
    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 下,测试运行良好。

有什么想法吗?

【问题讨论】:

听起来像一个错误。如果还没有,请创建一个bug report。 感谢您的意见。我将尝试创建一个新的、更简单的项目来演示相同的问题。然后打开一个错误报告。 在我们处于 2.18.1 期间,您是否检查过更新版本的原因? 请发布您使用的Java、Maven和Spring的版本以及maven-surefire-plugin的配置。 听起来像是找不到 RunWith。是否有可能在同一个类加载器中运行两个版本的 Surefire?您的依赖项之一是否加载了不同的版本?这看起来很像您在尝试加载同一类的两个不同版本时可能遇到的问题。 【参考方案1】:

运行 mvn 依赖:resolve

排除任何可能潜入的 JUnit 3.x 版本。

确保没有 TestNG 依赖项,如果有,它将加载 TestNG 注释而不是您需要的 JUnit。

【讨论】:

以上是关于TypeNotPresentExceptionProxy的主要内容,如果未能解决你的问题,请参考以下文章