【问题标题】:NoSuchFieldError when trying to run a jUnit test with Spring尝试使用 Spring 运行 jUnit 测试时出现 NoSuchFieldError
【发布时间】:2011-12-03 01:20:22
【问题描述】:

到目前为止,我有两个测试。一个只使用 jUnit 框架并且工作正常。另一个使用 spring-test 库并在我每次尝试运行它时创建此异常。有什么想法可能导致问题吗?

错误

java.lang.NoSuchFieldError: NULL
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:48)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:59)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:27)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:32)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:41)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:31)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Maven 测试依赖项

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.7</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${org.springframework.version}</version>
    <scope>test</scope>
</dependency>

依赖树

[INFO] [dependency:tree {execution: default-cli}]
[INFO] fake:war:1.0-SNAPSHOT
[INFO] +- log4j:log4j:jar:1.2.16:compile
[INFO] +- org.springframework:spring-web:jar:3.0.5.RELEASE:compile
[INFO] |  +- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.5.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.5.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-aop:jar:3.0.5.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-expression:jar:3.0.5.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-asm:jar:3.0.5.RELEASE:compile
[INFO] |  \- org.springframework:spring-core:jar:3.0.5.RELEASE:compile
[INFO] |     \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- commons-codec:commons-codec:jar:1.4:compile
[INFO] +- org.glassfish:javax.faces:jar:2.1.3:compile
[INFO] +- org.richfaces.ui:richfaces-components-ui:jar:4.0.0.Final:compile
[INFO] |  +- org.richfaces.ui:richfaces-components-api:jar:4.0.0.Final:compile
[INFO] |  \- org.richfaces.core:richfaces-core-api:jar:4.0.0.Final:compile
[INFO] +- org.richfaces.core:richfaces-core-impl:jar:4.0.0.Final:compile
[INFO] |  +- net.sourceforge.cssparser:cssparser:jar:0.9.5:compile
[INFO] |  |  \- org.w3c.css:sac:jar:1.3:compile
[INFO] |  \- com.google.guava:guava:jar:r08:compile
[INFO] +- org.hibernate:hibernate-validator:jar:4.2.0.Final:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] +- javax.xml.bind:jaxb-api:jar:2.2.2:compile
[INFO] |  +- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO] |  \- javax.activation:activation:jar:1.1:compile
[INFO] +- com.sun.xml.bind:jaxb-impl:jar:2.2.2:compile
[INFO] +- javax.servlet:jstl:jar:1.1.2:compile
[INFO] +- junit:junit:jar:4.7:test
[INFO] +- org.springframework:spring-test:jar:3.0.5.RELEASE:test
[INFO] +- javax.servlet:jsp-api:jar:2.0:provided
[INFO] \- javax.servlet:servlet-api:jar:2.4:provided

【问题讨论】:

  • 仅供参考,我在 Eclipse(无 Spring)中使用自定义类加载器运行时遇到了这个问题。

标签: java spring junit spring-test


【解决方案1】:

您使用的是旧版本的 Eclipse(Galileo 或更早版本)吗?还是较旧版本的junit插件?如果是这样,这可能是问题的原因。 ParentRunner 正在寻找在 JUnit 4.5 中引入的 Sorter.NULL:

package org.junit.runner.manipulation;

public class Sorter implements Comparator<Description> {
    /**
     * NULL is a <code>Sorter</code> that leaves elements in an undefined order
     */
    public static Sorter NULL= new Sorter(new Comparator<Description>() {
        public int compare(Description o1, Description o2) {
            return 0;
        }});

如果您没有这段代码,您可能使用的是 4.5 之前的版本。在 Eclipse 上,执行 Ctrl-Shift-T 并查看是否有多个版本的 Sorter 类可用,如果有,请确保它们都不是 4.5 之前的版本。另外,请查看 Build Path 中的项目设置,如果有 JUnit 条目(不是 maven 版本),请将其删除,然后重试。

编辑:这也可能是由 Maven 的传递依赖引起的。也许您的某个库依赖于 4.5 之前的 JUnit 版本。

【讨论】:

  • 感谢您提供有关使用 Sorter 的提示!就我而言,我依赖于导致问题的旧版本的 Cobertura!
  • @Matthew Farwell 我将 Kepler 与 JUnit4.10 一起使用,我在 Sorter 中有上述行,但我仍然收到 initializationError0 - java.lang.NoSuchFieldError: NULL
  • 啊!!..你真的救了我的命...谢谢
【解决方案2】:

我已经解决了这个问题,改用 JUnit 4.10。最初的例外是:

java.lang.NoSuchFieldError: NULL
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:54)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.<init>(JUnit45AndHigherRunnerImpl.java:23)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.<init>(JUnit45AndHigherRunnerImpl.java:23)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.mockito.internal.runners.util.RunnerProvider.newInstance(RunnerProvider.java:39)
    at org.mockito.internal.runners.RunnerFactory.create(RunnerFactory.java:28)
    at org.mockito.runners.MockitoJUnitRunner.<init>(MockitoJUnitRunner.java:57)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:32)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:41)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:31)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

【讨论】:

    【解决方案3】:

    这看起来是因为您的类路径中有多个 JUnit 依赖项(不同版本)。检查你的类路径(如果你要取消 maven 做一个 mvn 依赖项:树),然后摆脱旧的(再次,如果使用 maven,找出哪个直接导入的依赖项依次导入旧的 JUnit,并制作&lt;exclusion&gt; 在 pom.xml 中的 JUnit 子依赖项的该依赖项)。此外,您可能希望将实际的 JUnit 依赖项更新为(至少)4.10 的最新版本。

    【讨论】:

    • 我添加了依赖树,但我只看到了一个版本的 junit 库。 4.10 版也没有任何区别。
    • 这对我来说是个问题:junit-dep 4.4 是来自 org.jmock:jmock-junit4 的传递依赖,而我直接依赖于 junit 4.10。
    • @AnthonyW 我想通过使用 mvn 排除,但那是不久前的事了 ;)
    • @hertzsprung 无论出于何种原因,排除对我不起作用。谢谢你。见:stackoverflow.com/questions/17560153/…
    • @AnthonyW 你的mvn dependency:tree 告诉你什么有用的东西吗?
    【解决方案4】:

    我遇到了完全相同的问题,我发现它是由来自 org.jmock:jmock-junit4 的传递依赖引起的。当我用 org.jmock:jmock 替换它时,它被排序了。

    【讨论】:

      【解决方案5】:

      由于同样的原因,我收到了这个错误。但在我的情况下,我无法通过查看我的 pom.xml 或 maven 源代码树来查看 Junits 的不同版本,因为我的项目正在使用传递依赖项(项目之间)。即项目“A”依赖于项目“B”。所以项目“A”直接引用“B”(来自工作区)。所以当这种情况发生时,我们将无法识别依赖项中是否存在不同版本的junit。所以我所做的是,我关闭了项目“B”。从 Eclipse(不是从工作区)中删除了项目“A”。在项目“A”源目录中,删除除 pom、src 和 svn 支持文件夹之外的所有文件。将文件重新导入到 Eclipse 中。这解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多