NoSuchFieldError при попытке запустить тест jUnit с помощью Spring

Пока у меня два теста. Один использует только структуру 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

person user219882    schedule 07.10.2011    source источник
comment
К вашему сведению, я только что столкнулся с этой проблемой при работе с настраиваемым загрузчиком классов из Eclipse (без Spring).   -  person Gilead    schedule 02.10.2012


Ответы (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;
        }});

Если у вас нет этого фрагмента кода, вы, вероятно, используете версию до 4.5. В вашем Eclipse нажмите Ctrl-Shift-T и посмотрите, есть ли у вас несколько доступных версий класса Sorter, и если да, убедитесь, что ни одна из них не старше 4.5. Кроме того, загляните в настройку проекта в своем пути сборки и, если есть запись JUnit (не версия maven), удалите ее и повторите попытку.

РЕДАКТИРОВАТЬ: это также может быть вызвано транзитивной зависимостью Maven. Возможно, одна из ваших библиотек зависит от версии JUnit до 4.5.

Путь сборки Eclipse, запись JUnit

person Matthew Farwell    schedule 07.10.2011
comment
Спасибо за совет по использованию Sorter! В моем случае у меня была зависимость от более старой версии Cobertura, которая вызывала проблемы! - person alexandroid; 17.01.2013
comment
@Matthew Farwell Я использую Kepler с JUnit4.10, и у меня есть указанная выше строка в Sorter, но все равно я получаю initializationError0 - java.lang.NoSuchFieldError: NULL - person yashhy; 30.12.2013
comment
Ах!!.. вы действительно спасли мой день... Спасибо - person Raju Penumatsa; 17.04.2015

Я решил это, перейдя на 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)
person user2797063    schedule 19.09.2013

Похоже, это вызвано тем, что у вас есть несколько зависимостей JUnit (разных версий) в вашем пути к классам. Проверьте свой путь к классам для этого (если вы не используете maven, выполните зависимость mvn: дерево), а затем избавьтесь от более старой (опять же, если вы используете maven, узнайте, какая непосредственно импортированная зависимость импортирует, в свою очередь, более старый JUnit, и сделайте <exclusion> в этой зависимости для подзависимости JUnit в вашем pom.xml). Также вы можете обновить свою фактическую зависимость JUnit до последней версии, которая (как минимум) 4.10.

person Shivan Dragon    schedule 07.10.2011
comment
Я добавил дерево зависимостей и вижу только одну версию библиотеки junit. Также версия 4.10 не имела никакого значения. - person user219882; 07.10.2011
comment
Это было проблемой для меня: junit-dep 4.4 был транзитивной зависимостью от org.jmock:jmock-junit4, в то время как я напрямую зависел от junit 4.10. - person hertzsprung; 15.10.2012
comment
@AnthonyW Используя исключение mvn, я мог себе представить, но это было давно;) - person hertzsprung; 10.07.2013
comment
@hertzsprung По какой-то причине у меня не работает исключение. Спасибо. См.: stackoverflow.com/questions/ 17560153/ - person AnthonyW; 10.07.2013
comment
@AnthonyW Ваш mvn dependency:tree говорит вам что-нибудь полезное? - person hertzsprung; 10.07.2013
comment
@hertzsprung Использование m2e для Eclipse. Все подробности в соответствующем вопросе. Короче говоря, у меня есть транзитивная зависимость от JUnit-dep от JMock, которая отказывается быть исключенной и не исключается моей зависимостью от JUnit (разные имена артефактов). - person AnthonyW; 10.07.2013

У меня была точно такая же проблема, и я обнаружил, что она вызвана транзитивной зависимостью от org.jmock:jmock-junit4. Он был отсортирован, когда я заменил его на org.jmock:jmock.

person Micho    schedule 20.03.2014

Я получил эту ошибку по той же причине. но в моем случае я не смог увидеть другую версию Junits, просто заглянув в исходное дерево pom.xml или maven, поскольку мой проект использовал транзитивные зависимости (между проектами). т. е. проект «А» зависит от проекта «Б». поэтому проект «А» напрямую ссылается на «Б» (из рабочей области). поэтому, когда это произойдет, мы не сможем определить, существует ли в зависимости другая версия junit. так что я сделал, я закрыл проект "Б". удален проект «А» из eclipse (не из рабочей области). в исходном каталоге проекта «A» удалите все файлы, кроме pom, src и вспомогательной папки svn. Повторно импортируйте файл обратно в eclipse. Это решило проблему.

person Shravan Ramamurthy    schedule 29.09.2015