java 尝试使用 Spring 运行 jUnit 测试时出现 NoSuchFieldError
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7688395/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
NoSuchFieldError when trying to run a jUnit test with Spring
提问by user219882
So far I have two tests. One uses only jUnit framework and works fine. The other one uses spring-test library and creates this exception every time I try to run it. Any ideas what may cause the problem?
到目前为止,我有两个测试。一个只使用 jUnit 框架并且工作正常。另一个使用 spring-test 库并在我每次尝试运行它时创建此异常。任何可能导致问题的想法?
Error
错误
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 test dependencies
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>
Dependency tree
依赖树
[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
回答by Matthew Farwell
Are you using an older version of Eclipse (Galileo or before)? or an older version of the junit plugin? If so, this may be the cause of the problem. ParentRunner is looking for Sorter.NULL, which was introduced in JUnit 4.5:
您使用的是旧版本的 Eclipse(Galileo 或之前版本)吗?还是旧版本的junit插件?如果是这样,这可能是问题的原因。ParentRunner 正在寻找 Sorter.NULL,它是在 JUnit 4.5 中引入的:
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;
}});
If you don't have this bit of code, you're probably using a pre-4.5 version. On your Eclipse, do Ctrl-Shift-T and see if you have multiple versions of the Sorter class available, and if so, make sure neither of them are pre 4.5. Also, look in your project setup in your Build Path, and if there is JUnit entry (not the maven version), remove it, and try again.
如果您没有这段代码,那么您可能使用的是 4.5 之前的版本。在您的 Eclipse 上,按 Ctrl-Shift-T 并查看您是否有多个版本的 Sorter 类可用,如果有,请确保它们都不是 4.5 之前的版本。此外,在您的构建路径中查看您的项目设置,如果有 JUnit 条目(不是 Maven 版本),请将其删除,然后重试。
EDIT: This can also be caused by a transitive dependency of Maven. Maybe one of your libraries has a dependency on a JUnit version which is pre-4.5.
编辑:这也可能是由 Maven 的传递依赖引起的。也许您的某个库依赖于 4.5 之前的 JUnit 版本。
回答by user2797063
I have solved this, changing to JUnit 4.10. The original exception was:
我已经解决了这个问题,改为 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.<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)
回答by Micho
I had exactly the same problem and I found out it was caused by a transitive dependency from org.jmock:jmock-junit4. It was sorted when I replaced it with org.jmock:jmock.
我遇到了完全相同的问题,我发现它是由 org.jmock:jmock-junit4 的传递依赖引起的。当我用 org.jmock:jmock 替换它时,它被排序。
回答by Shivan Dragon
This looks like it's caused by the fact that you have multiple JUnit dependencies (of different versions) in your classpath. Check your classpath for that (if you're unsing maven do a mvn dependency:tree), and then get rid of the older one (again, if using maven, find out which directlly imported dependency imports in turn the older JUnit, and make an <exclusion>
on that dependency for the JUnit sub-dependency in your pom.xml). Also you might want to update your actual JUnit dependency to the latest version which is (at least) 4.10.
这看起来是因为您的类路径中有多个 JUnit 依赖项(不同版本)。检查你的类路径(如果你正在取消 maven 做一个 mvn 依赖:树),然后摆脱旧的(同样,如果使用 maven,找出哪些直接导入的依赖依次导入旧的 JUnit,并使一个<exclusion>
在你的pom.xml这种依赖性的JUnit的子依赖性)。此外,您可能希望将实际的 JUnit 依赖项更新到(至少)4.10 的最新版本。
回答by Shravan Ramamurthy
I got this error due to the same reason. but in my case i was unable to see the different version of Junits just by looking into my pom.xml or maven source tree as my project was using transitive dependencies (between projects). i,e project "A" has a dependency on project "B". so project "A" directly referring to "B"(from the workspace). so when this happens, we will not be able to identify if the different version of junit exists in the dependency. so what i did was, i closed the project "B". deleted project "A" from eclipse (not from the workspace). in the project "A" source directory, delete all the files except the pom, src and the svn supporting folder. Re-import the file back into to eclipse. This resolved the issue.
由于同样的原因,我收到了这个错误。但在我的情况下,我无法通过查看我的 pom.xml 或 maven 源代码树来看到不同版本的 Junit,因为我的项目使用了传递依赖项(项目之间)。i,e 项目“A”依赖于项目“B”。所以项目“A”直接引用“B”(来自工作区)。因此,当发生这种情况时,我们将无法确定依赖项中是否存在不同版本的 junit。所以我所做的是,我关闭了项目“B”。从 Eclipse (不是从工作区)中删除了项目“A”。在项目“A”源目录中,删除除pom、src和svn支持文件夹之外的所有文件。将文件重新导入到 eclipse 中。这解决了问题。