복붙노트

[SPRING] Spring을 사용하여 jUnit 테스트를 실행하려고하면 NoSuchFieldError가 발생합니다.

SPRING

Spring을 사용하여 jUnit 테스트를 실행하려고하면 NoSuchFieldError가 발생합니다.

지금까지 두 가지 테스트가 있습니다. 하나는 jUnit 프레임 워크를 사용하고 잘 작동합니다. 다른 하나는 스프링 테스트 라이브러리를 사용하고 실행하려고 할 때마다이 예외를 생성합니다. 어떤 아이디어가 문제를 일으킬 수 있습니까?

오류

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

해결법

  1. ==============================

    1.이전 버전의 Eclipse (갈릴레오 이전 버전)를 사용하고 있습니까? 또는 이전 버전의 junit 플러그인? 그렇다면 문제의 원인 일 수 있습니다. ParentRunner는 JUnit 4.5에서 소개 된 Sorter.NULL을 찾고 있습니다.

    이전 버전의 Eclipse (갈릴레오 이전 버전)를 사용하고 있습니까? 또는 이전 버전의 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 이전 버전을 사용하고있을 것입니다. 이클립스에서 Ctrl-Shift-T를 사용하여 여러 버전의 Sorter 클래스를 사용할 수 있는지 확인하십시오. 그렇다면 둘 다 4.5 이전 버전이 아닌지 확인하십시오. 또한 빌드 경로에서 프로젝트 설정을 살펴보고 JUnit 항목 (메이븐 버전 아님)이 있으면 제거하고 다시 시도하십시오.

    편집 : Maven의 전이 종속성에 의해 발생할 수도 있습니다. 어쩌면 라이브러리 중 하나가 4.5 이전의 JUnit 버전에 종속되어있을 수도 있습니다.

  2. ==============================

    2.JUnit 4.10으로 변경하면서이 문제를 해결했습니다. 원래 예외는 다음과 같습니다.

    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. ==============================

    3.이것은 클래스 패스에 여러 버전의 여러 JUnit 종속성이 있다는 사실 때문에 발생합니다. maven을 사용하지 않는다면 mvn 의존성을 트리는 트리 구조의 클래스 패스를 확인하고 이전의 트리를 없애라. (다시, maven을 사용한다면 의존성 임포트를 import 한 directlly 이전 JUnit을 찾아서 make pom.xml의 JUnit 하위 종속성에 대한 종속성에 대한 <제외> 또한 실제 JUnit 종속성을 (최소한) 4.10 인 최신 버전으로 업데이트하려고 할 수 있습니다.

    이것은 클래스 패스에 여러 버전의 여러 JUnit 종속성이 있다는 사실 때문에 발생합니다. maven을 사용하지 않는다면 mvn 의존성을 트리는 트리 구조의 클래스 패스를 확인하고 이전의 트리를 없애라. (다시, maven을 사용한다면 의존성 임포트를 import 한 directlly 이전 JUnit을 찾아서 make pom.xml의 JUnit 하위 종속성에 대한 종속성에 대한 <제외> 또한 실제 JUnit 종속성을 (최소한) 4.10 인 최신 버전으로 업데이트하려고 할 수 있습니다.

  4. ==============================

    4.나는 똑같은 문제가 있었고 org.jmock : jmock-junit4의 전이 의존성 (transitive dependency)이 원인이라는 것을 알았다. org.jmock : jmock으로 바꿀 때 정렬되었습니다.

    나는 똑같은 문제가 있었고 org.jmock : jmock-junit4의 전이 의존성 (transitive dependency)이 원인이라는 것을 알았다. org.jmock : jmock으로 바꿀 때 정렬되었습니다.

  5. ==============================

    5.나는 같은 이유로 인해이 오류가 발생했습니다. 하지만 내 경우에는 프로젝트가 전이 의존성 (프로젝트 간)을 사용하면서 내 pom.xml 또는 maven 소스 트리를 조사하여 Junits의 다른 버전을 볼 수 없었습니다. i, e 프로젝트 "A"는 프로젝트 "B"에 종속됩니다. 따라서 "A"프로젝트는 "B"를 직접 참조합니다 (작업 공간에서). 그래서 이런 일이 발생하면 다른 버전의 junit이 종속물에 존재하는지 여부를 확인할 수 없습니다. 그래서 내가 한 것은 프로젝트 "B"를 닫았습니다. (작업 공간이 아닌) Eclipse에서 "A"프로젝트를 삭제했습니다. 프로젝트 "A"소스 디렉토리에서 pom, src 및 svn 지원 폴더를 제외한 모든 파일을 삭제하십시오. 이클립스로 다시 파일을 다시 가져옵니다. 이 문제가 해결되었습니다.

    나는 같은 이유로 인해이 오류가 발생했습니다. 하지만 내 경우에는 프로젝트가 전이 의존성 (프로젝트 간)을 사용하면서 내 pom.xml 또는 maven 소스 트리를 조사하여 Junits의 다른 버전을 볼 수 없었습니다. i, e 프로젝트 "A"는 프로젝트 "B"에 종속됩니다. 따라서 "A"프로젝트는 "B"를 직접 참조합니다 (작업 공간에서). 그래서 이런 일이 발생하면 다른 버전의 junit이 종속물에 존재하는지 여부를 확인할 수 없습니다. 그래서 내가 한 것은 프로젝트 "B"를 닫았습니다. (작업 공간이 아닌) Eclipse에서 "A"프로젝트를 삭제했습니다. 프로젝트 "A"소스 디렉토리에서 pom, src 및 svn 지원 폴더를 제외한 모든 파일을 삭제하십시오. 이클립스로 다시 파일을 다시 가져옵니다. 이 문제가 해결되었습니다.

  6. from https://stackoverflow.com/questions/7688395/nosuchfielderror-when-trying-to-run-a-junit-test-with-spring by cc-by-sa and MIT license