[java] Eclipse LauncherFactory에 대한 NoClassDefFoundError로 인해 JUnit 5를 사용하여 발견 된 테스트가 없습니다.

문제

내 프로젝트 JUnit 테스트 (Java 9 및 Eclipse Oxygen 1.a와 함께 JUnit 5 사용)를 실행할 때마다 eclipse가 테스트를 찾을 수 없다는 문제가 발생합니다.

설명

실행 구성에서 eclipse는 @Test로 주석 처리 된 메소드도 찾을 수 없지만 대신 ” (모든 메소드) ” 만 표시합니다 . 다음 그림은 내 설정을 더 잘 보여줍니다.

https://imgur.com/a/FTe9c

콘솔 출력 :

java.lang.NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.<init>(JUnit5TestLoader.java:31)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.base/java.lang.Class.newInstance(Unknown Source)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createRawTestLoader(RemoteTestRunner.java:368)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createLoader(RemoteTestRunner.java:363)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.java:307)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.java:222)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.launcher.core.LauncherFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
    ... 11 more

지금까지 시도한 것

나는 이미 시도했다

  • 빌드 경로에서 테스트 폴더를 제거하고 다시 추가합니다.
  • @Test로 주석이 달린 메소드 위로 마우스를 가져 가서 테스트를 시작하려면 “Run as JUnit Test”를 클릭하십시오.
  • Buildpath에서 JUnit을 제거하고 다시 추가하십시오.
  • 이클립스 다시 시작
  • 또한 프로젝트 전체 프로젝트를 한 컴퓨터에서 다른 컴퓨터로 옮겼고 제공된 이클립스 설치로 시도했습니다.
  • 테스트 방법의 이름을 변경합니다.
  • @Test 주석을 다시 입력하려면

이러한 단계 중 일부는 여기 에서 찾을 수 있지만 결국 문제는 남아 있습니다.



답변

당신은 우연히 이클립스 버그 525948 이미 수정되었습니다하고있는이 곧 출시 Oxygen.3 (4.7.3) 3 월 21, 2018 게시 할 것이다.

해결 방법으로 테스트 코드를 별도의 프로젝트에 넣고 테스트 중인 프로젝트를 모듈 경로에 추가하되 module-info.java테스트 프로젝트에를 추가하지 마십시오 . 프로젝트, 클래스 및 모듈 이름을 지정하면 다음과 같이 표시됩니다.

여기에 이미지 설명 입력

Eclipse Oxygen.1a의 Java 9 및 JUnit 5가 작동하는 비디오를 참조하십시오.


답변

테스트를 마우스 오른쪽 버튼으로 클릭하고 ‘구성 실행’을 선택하고 다음과 같이 “테스트 실행기 :”선택을 ‘JUnit 4’로 변경하여 문제를 해결했습니다.

실행 구성 스크린 샷

다시 테스트를 실행했는데 효과가있었습니다.


답변

STS 3.9.1과 동일한 문제가 있습니다. Eclipse 버그처럼 보이지만이 문제를 해결하려면 junit-platform-launcher프로젝트에 테스트 종속성 을 추가 할 수 있습니다 ( https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher )

이것이 gradle을 사용하는 내 프로젝트에서 한 방법입니다.

dependencies {
    // other stuff here

    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "5.${junit5MinorVersion}"
    testCompile group: 'org.junit.platform', name: 'junit-platform-launcher', version: "1.${junit5MinorVersion}"
}

gradle.properties 파일 :

junit5MinorVersion=1.0

IntelliJ IDEA를 사용하는 동안이 예외가 표시되는 경우에도 동일하게 적용됩니다.


답변

제 경우 문제는 저 자신이었고 Eclipse와 같은 IDE가 없었습니다. JUnit 4 테스트 클래스를 가져 왔습니다.

따라서 이것을 가져 오지 마십시오.

import org.junit.Test  // JUnit 4

그러나 가져 오십시오.

import org.junit.jupiter.api.Test // JUnit 5


답변

지금까지의 답변은 Eclipse를 반드시 사용하지 않는 다른 사람들과 코드를 공유하는 문제를 해결하지 못했습니다. 여기에 한 가지 제안이 있습니다. 핵심은 Eclipse 케이스를 해결하기 위해 maven 프로필을 사용하는 것입니다.

junit5.version다음과 같이 pom에 속성 을 정의했다고 가정합니다 .

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit5.version>5.1.1</junit5.version>
</properties>

그런 다음 profiles섹션에서 다음을 추가하십시오.

<profiles>
    <profile>
        <id>eclipse</id>
        <dependencies>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
            </dependency>
            <dependency>
                <groupId>org.junit.platform</groupId>
                <artifactId>junit-platform-launcher</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>${junit5.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-launcher</artifactId>
                    <version>1.1.1</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </profile>
</profiles>

그 후에해야 할 일은 로컬 Eclipse에서 프로필을 선택하는 것입니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 선택 Maven > Select Maven Profiles...(또는 Ctrl+ Alt+ P) 한 다음 방금 만든 “eclipse”프로필을 확인합니다.

Maven 프로필 선택

그것으로 당신은 끝났습니다. Eclipse는 예상대로 Junit 5 테스트를 실행하지만 추가 한 구성은 다른 빌드 나 다른 IDE를 오염시키지 않습니다.


답변

이 maven 종속성을 JUnit Jupiter (v.5.5.1)에 추가하면 문제가 해결됩니다.

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.5.1</version>
    <scope>test</scope>
</dependency>


답변

간단한 수정 : (JUnit 5 라이브러리 추가)

명령:

  • 프로젝트-> 빌드 경로-> 빌드 경로 구성을 마우스 오른쪽 버튼으로 클릭하십시오.
  • 팝업-> 라이브러리 추가-> JUnit-> JUnit 5-> 완료-> 적용
  • 프로젝트에 추가 된 JUnit 5 라이브러리 (및 해당 jar)가 표시되어야합니다.
  • 프로젝트-> Maven-> 프로젝트 업데이트-> 확인을 마우스 오른쪽 버튼으로 클릭하십시오.