12

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?

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

<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
user219882
  • 15,274
  • 23
  • 93
  • 138
  • FYI, I just ran into this problem when running with a custom class loader from within Eclipse (no Spring). – Gilead Oct 02 '12 at 10:25

5 Answers5

20

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:

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.

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.

Eclipse Build Path, JUnit entry

Matthew Farwell
  • 60,889
  • 18
  • 128
  • 171
  • Thanks for the tip about using Sorter! In my case I had a dependency on an older version of Cobertura which was causing problems! – alexandroid Jan 17 '13 at 18:30
  • @Matthew Farwell i'm using Kepler with JUnit4.10 and I have the above line in Sorter, but stil i'm getting `initializationError0 - java.lang.NoSuchFieldError: NULL` – yashhy Dec 30 '13 at 09:46
2

I have solved this, changing to JUnit 4.10. The original exception was:

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)
1

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.

Micho
  • 3,929
  • 13
  • 37
  • 40
1

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.

Shivan Dragon
  • 15,004
  • 9
  • 62
  • 103
  • I added the dependency tree and I see only one version of junit library. Also version 4.10 didn't make any difference. – user219882 Oct 07 '11 at 14:22
  • This was the problem for me: junit-dep 4.4 was a transitive dependency from org.jmock:jmock-junit4, while I was dependending upon junit 4.10 directly. – hertzsprung Oct 15 '12 at 12:43
  • @AnthonyW By using a mvn exclusion I'd imagine, but it was a while ago ;) – hertzsprung Jul 10 '13 at 15:52
  • @hertzsprung For whatever reason, an exclusion is not working for me. Thanks tho. See: http://stackoverflow.com/questions/17560153/junit-annotation-not-running/17564130?noredirect=1#17564130 – AnthonyW Jul 10 '13 at 16:00
  • @AnthonyW Does your `mvn dependency:tree` tell you anything useful? – hertzsprung Jul 10 '13 at 16:39
  • @hertzsprung Using m2e for Eclipse. All details are in related question. In short, I have a transitive dependency on JUnit-dep from JMock that refuses to be excluded and is not omitted by my reliance on JUnit (different artifact names). – AnthonyW Jul 10 '13 at 16:49
0

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.

Shravan Ramamurthy
  • 3,896
  • 5
  • 30
  • 44