尝试使用Spring运行jUnit测试时出现NoSuchFieldError

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

错误

java.lang.NoSuchFieldError: NULL at org.junit.runners.ParentRunner.(ParentRunner.java:48) at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:59) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.(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.(JUnit4TestReference.java:32) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.(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测试依赖项

  junit junit 4.7 test   org.springframework spring-test ${org.springframework.version} test  

依赖树

 [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(Galileo还是以前版本)? 或junit插件的旧版本? 如果是这样,这可能是问题的原因。 ParentRunner正在寻找在JUnit 4.5中引入的Sorter.NULL:

 package org.junit.runner.manipulation; public class Sorter implements Comparator { /** * NULL is a Sorter that leaves elements in an undefined order */ public static Sorter NULL= new Sorter(new Comparator() { 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版本。

Eclipse Build Path,JUnit条目

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

 java.lang.NoSuchFieldError: NULL at org.junit.runners.ParentRunner.(ParentRunner.java:54) at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:55) at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.(JUnit45AndHigherRunnerImpl.java:23) at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.(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.(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.(JUnit4TestReference.java:32) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.(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) 

这看起来像是因为您在类路径中有多个JUnit依赖项(不同版本)。 检查你的类路径(如果你没有注意maven做一个mvn依赖:树),然后摆脱旧的(再次,如果使用maven,找出哪个直接导入的依赖项导入反过来旧的JUnit,并使对pom.xml中JUnit子依赖关系的依赖关系的 )。 此外,您可能希望将实际的JUnit依赖关系更新为(至少)4.10的最新版本。

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

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