ข้อยกเว้นไม่พบคลาสเมื่อเรียกใช้การทดสอบ JUnit


117

ฉันได้รับข้อผิดพลาดนี้เมื่อเรียกใช้การทดสอบ JUnit ใน Eclipse:

Class not found com.myproject.server.MyTest
java.lang.ClassNotFoundException: com.myproject.server.MyTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    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)

ฉันได้ลองเพิ่มJUnitไลบรารีใน classpath แล้วแม้ว่าฉันจะใช้ maven และไลบรารี JUnit อยู่ในการพึ่งพา POM

ฉันได้ลองทำความสะอาดโปรเจ็กต์แล้วและสร้างเคสทดสอบ JUnit ใหม่โดยใช้ปลั๊กอิน JUnit สำหรับ Eclipse แต่ยังคงได้รับข้อผิดพลาดเหมือนเดิม


10
ลองรันmvn clean testครั้งเดียวมันจะรวบรวมคลาสทดสอบทั้งหมด
Jigar Joshi

1
โปรดตรวจสอบว่า com.myproject.server.MyTest อยู่ในโฟลเดอร์ bin หรือไม่ ฉันหมายถึงถ้าคอมไพล์ไม่ได้เนื่องจากข้อผิดพลาดในการคอมไพล์หรือสร้างพา ธ คุณจะได้รับข้อผิดพลาดนี้
vikas

คุณกำลังทดสอบชั้นเรียนเดียวหรือทั้งโครงการ?
Doszi89

อาจซ้ำกันของEclipse - java.lang.ClassNotFoundException
Amos M. Carpenter

1
ในกรณีของฉันที่เรียกใช้การทดสอบโดยใช้ Maven ได้ผล แต่ถ้าฉันคลิกขวาที่คลาสทดสอบแล้วเลือก Run As -> JUnit Test จะรายงาน ClassNotFoundException ฉันแก้ไขโดยคลิกขวาที่โปรเจ็กต์และไปที่ Properties -> Builders จากนั้นย้าย Maven Project Builder ไปไว้เหนือ Java Builder
xorcus

คำตอบ:


121

สิ่งนี้ดูเหมือนจะเกิดขึ้นเนื่องจากมีเพียงซอร์สโค้ดเท่านั้นที่คอมไพล์เมื่อคุณใช้mvn clean compile(ฉันใช้ maven 3.1.0 ดังนั้นฉันไม่แน่ใจว่ามันทำงานแบบนี้เสมอหรือไม่)

หากคุณเรียกใช้mvn testโค้ดทดสอบจะคอมไพล์ด้วยเช่นกัน แต่จะรันการทดสอบ (ซึ่งอาจไม่เป็นที่ต้องการในทันทีหากคุณพยายามรันผ่าน Eclipse) วิธีแก้ปัญหานี้คือการเพิ่มtest-compileลำดับคำสั่ง Maven ของคุณเมื่อใดก็ตาม คุณทำmvn clean. mvn clean compile test-compileตัวอย่างเช่นคุณจะวิ่ง


1
ฉันเคยเกิดเหตุการณ์นี้ครั้งเดียวและคำตอบของ slomek ใช้งานได้และจากนั้นข้อผิดพลาดเดียวกันนี้ก็เกิดขึ้นอีกครั้งดังนั้นฉันจึงต้องลองสิ่งนี้ด้วย ตอนนี้ใช้งานได้ดีอีกครั้งดังนั้นเพื่อความปลอดภัยคุณอาจต้องการทำทั้งสองอย่างนี้
Roger

ขอบคุณมันใช้งานได้สำหรับฉัน แต่ในกรณีของฉันมันไม่ทำงานจนกว่าจะปิดและเปิดโครงการอีกครั้งในคราส
Paramesh Korrakuti

พูดง่ายๆคือทำ 'mvn clean test-compile' จากนั้นเรียกใช้การทดสอบ Junit ของคุณใน eclipse มันได้ผลสำหรับฉัน ขอบคุณ
Sreram

104

ผมมีปัญหาที่คล้ายกันกับการทดสอบของฉันและพบที่ไหนสักแห่งในเว็บที่คุณต้องไปเส้นทางรูปร่างในคุณสมบัติของโครงการและย้ายMaven อ้างอิงข้างต้นระบบห้องสมุด JRE ดูเหมือนว่าจะได้ผลสำหรับฉัน


1
ขอบคุณสิ่งนี้ช่วยแก้ปัญหาของฉันได้ การทดสอบจริงทำให้คลาสไม่พบข้อผิดพลาดเมื่อฉันพยายามเรียกใช้ ฉันคิดว่านี่อาจเป็นขั้นตอนแรกที่ดีกว่าก่อนที่จะเพิ่มเป้าหมายการสร้าง mvn เพิ่มเติม
Roger

8
วิธีนี้อธิบายด้วยภาพหน้าจอในโพสต์นี้ (ในกรณีที่ขั้นตอนไม่ชัดเจนจากคำตอบของ @ slomek ด้านบน)
nhylated

2
ฉันไม่สามารถย้าย Maven Managed Dependencies เหนือ JRE System Library ใน Eclipse Mars 2 ได้ แต่ฉันสามารถคลิกขวาที่โปรเจ็กต์แล้วไปที่ Properties -> Builders จากนั้นย้าย Maven Project Builder เหนือ Java Builder และมันก็ใช้ได้สำหรับฉัน
xorcus

ฉันลองทำตามข้างต้นทั้งหมดแล้ว แต่ก็ไม่ได้ผลฉันไม่สามารถย้าย Maven Dependencies เกี่ยวกับ JRE System Library ได้ แต่อยู่ในแท็บ Libraries จากนั้นฉันไปที่ Build Path -> Order & Export -> ตามที่สามารถย้าย Maven Dependencies ไปไว้เหนือไลบรารีระบบ JRE จากนั้นฉันก็สร้างโปรเจ็กต์และรันการติดตั้ง Maven จากนั้นการทดสอบก็ทำงานได้สำเร็จ
Megan

22

ฉันประสบปัญหาเดียวกันและสามารถแก้ไขได้โดยใช้คำตอบของ @ slomek แต่ปัญหากลับมาปรากฏอีกครั้งหลังจากนั้น

ในที่สุดฉันก็แก้ไขโดยการเพิ่มโฟลเดอร์ผลลัพธ์ของโปรเจ็กต์ของฉันลงในคอนฟิกูเรชันการรันของการทดสอบ JUnit ขั้นตอนคือ:

  • ค้นหาโฟลเดอร์ผลลัพธ์ของโครงการของคุณจาก Project properties -> Java Build Path -> Default output folder
    • โดยปกติจะเป็น <project-folder>/bin
  • ไปที่ Run -> Run Configurations...
  • คลิกที่การกำหนดค่าการรันของการทดสอบหน่วยและคลิกที่Classpathแท็บ
  • เพิ่มโฟลเดอร์ผลลัพธ์ของโปรเจ็กต์ของคุณอย่างชัดเจนภายใต้User Entries- แม้ว่าโปรเจ็กต์จะรวมอยู่ในนั้นแล้วก็ตาม
    • คลิกAdvanced -> Add folderเพื่อเพิ่มโฟลเดอร์ผลลัพธ์

ปัญหานี้อาจเกิดจากการตั้งค่าโปรเจ็กต์แปลก ๆ ใน Eclipse เช่นโฟลเดอร์ซอร์สที่มีโปรเจ็กต์ maven ซ้อนที่อิมพอร์ตเป็นโปรเจ็กต์ / โฟลเดอร์เดียว (อย่างน้อยนั่นคือวิธีการตั้งค่าโปรเจ็กต์ของฉัน)


ขอบคุณมาก; ฉันมีปัญหานี้ การแก้ไขของคุณใช้ได้ผลสำหรับฉัน สองอันดับแรกไม่ได้ Up-ได้รับการโหวต
davtom

แจ่มแน่นอน! ฉันเกาหัวมานานแล้ว ขอบคุณ!
RayCh

17

หากปัญหานี้เกิดขึ้นใน Eclipse เท่านั้นการรันคำสั่ง Project -> Clean ... บนโปรเจ็กต์ที่เลือกอาจช่วยได้


ขอบคุณ - มันใช้งานได้จริงสำหรับฉัน - JAVE EE eclipse gradlew
Abdeali Chandanwala

11

หลังจากลองทำทุกอย่างแล้วโดยไม่มีการปรับปรุงฉันแก้ไขปัญหาของฉันได้โดยเพียงแค่รีสตาร์ท Eclipse


5

ฉันแก้ไขปัญหาของฉันโดยเรียกใช้การอัปเดต maven คลิกขวาโครงการโครงการของคุณ> Maven> อัปเดตโครงการ


3

ในกรณีของฉันฉันมีโครงสร้างไดเร็กทอรี maven ผิด

ซึ่งควรเป็นดังนี้:

/ src / test / java / com.myproject.server.MyTest

หลังจากที่ฉันแก้ไขแล้ว - ทุกอย่างทำงานได้อย่างมีเสน่ห์


2

ในกรณีของฉันขั้นตอนถัดไปเท่านั้นที่ช่วยฉันในการแก้ไขปัญหานี้:

  1. Project-> properties-> Run / Debug Settings
  2. ใน "เปิดใช้การกำหนดค่าสำหรับ" ..... "" ให้เลือกคลาส / โครงการ
  3. แก้ไข -> Classpath -> "กู้คืนรายการเริ่มต้น"

ขอบคุณ !! แค่นี้ก็ช่วยแล้ว !!
sumandas

1

ก่อนหน้านี้ในกรณีนี้ฉันมักจะทำ mvn eclipse:eclipseและรีสตาร์ท Eclipse และใช้งานได้ หลังจากย้ายไปที่ GIT มันก็หยุดทำงานสำหรับฉันซึ่งค่อนข้างแปลก

ปัญหาพื้นฐานที่นี่คือ Mr Eclipse ไม่พบคลาสที่คอมไพล์ จากนั้นฉันตั้งค่าโฟลเดอร์ผลลัพธ์เป็น Project / target / test-class ซึ่งเป็นค่าเริ่มต้นที่สร้างขึ้นโดยmvn clean installไม่ข้ามการทดสอบและดำเนินการแก้ไขปัญหาต่อไปนี้:

ตัวเลือกที่ 1: ตั้งค่า classpath สำหรับแต่ละกรณีการทดสอบ

Eclipse -> Run -> Run Configurations -> ใต้ JUnit-> select mytest -> ใต้แท็บ classpath-> Select User Entries-> Advanced-> Add Folder -> Select -> Apply-> Run

ตัวเลือกที่ 2: สร้างตัวแปร classpath และรวมไว้ใน classpath สำหรับกรณีทดสอบทั้งหมด

Eclipse -> Windows -> ตัวแปร Classpath -> ใหม่ -> [ชื่อ: Junit_test_cases_cp | path:] -> ok จากนั้นไปที่ Eclipse-> Run -> Run Configurations -> JUnit-> select mytest -> ใต้แท็บ classpath -> Select User Entries-> Advanced-> Add classpath parameters-> Select Junit_test_cases_cp-> ok- > Apply-> Run

นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉันหลังจากลองทำตามคำแนะนำทั้งหมดทางออนไลน์


1

ฉันมีปัญหาเดียวกันกับโครงการ Gradle ที่มี SourceSet ทดสอบที่มีไดเรกทอรีทรัพยากรสองรายการ

ข้อมูลโค้ดนี้มาจาก main-module.gradle และเพิ่ม Resource dir ให้กับ SourceSet ทดสอบ:

sourceSets {
    test {
        resources {
            srcDir('../other-module/src/test/resources')
        }
    }
}

การทำเช่นนี้ฉันมีไดเรกทอรีทรัพยากรสองรายการที่เกี่ยวข้องกับ SourceSet การทดสอบของโมดูลหลักของโครงการ:

../other-module/src/test/resources src / test / resources (สัมพันธ์กับโฟลเดอร์โมดูลหลักที่ปลั๊กอิน java เพิ่มโดยอัตโนมัติ)

ฉันพบว่าถ้าฉันมีไฟล์สองไฟล์ที่มีชื่อเดียวกันทั้งในไดเร็กทอรีต้นทางบางอย่างในขั้นตอนทรัพยากรกระบวนการทำงานผิดพลาด ด้วยเหตุนี้จึงไม่มีการคอมไพล์เริ่มต้นและด้วยเหตุนี้จึงไม่มีการคัดลอก. class ในไดเร็กทอรี bin โดยที่ JUnit กำลังมองหาคลาส ClassNotFoundException หายไปเพียงแค่เปลี่ยนชื่อหนึ่งในสองไฟล์


1

NoClassDefFoundError หมายความว่าไม่สามารถเริ่มต้นคลาสได้ มันมีอะไรจะทำอย่างไรกับการหาชั้นเรียน ฉันได้รับข้อผิดพลาดนี้เมื่อเรียก trim () บน null String

JUnit จะไม่แสดง NullPointerException สตริงไม่เป็นโมฆะเมื่อทำงานตามปกติเพราะฉันกำลังดึงสตริงจากไฟล์คุณสมบัติซึ่งไม่สามารถใช้สำหรับการทดสอบได้

คำแนะนำของฉันคือนำชิ้นส่วนออกจากชั้นเรียนจนกว่าการทดสอบของคุณจะเริ่มผ่าน จากนั้นคุณสามารถกำหนดได้ว่าบรรทัดใดให้ข้อผิดพลาด


0

ฉันมีปัญหาคล้าย ๆ กันกับ Eclipse Helios ของฉันซึ่งทำการดีบัก Junits ปัญหาของฉันแตกต่างกันเล็กน้อยเนื่องจากฉันสามารถเรียกใช้ Junits ได้สำเร็จ แต่เมื่อฉันได้รับ ClassNotFoundException ในขณะที่ดีบัก JUNIT เดียวกัน

ฉันได้ลองใช้วิธีแก้ปัญหาต่างๆทั้งหมดที่มีอยู่ใน Stackoverflow.com และฟอรัมอื่น ๆ แล้ว แต่ดูเหมือนจะไม่ได้ผล หลังจากต่อสู้กับปัญหาเหล่านี้เป็นเวลาเกือบสองวันในที่สุดฉันก็หาวิธีแก้ไขได้

หากดูเหมือนวิธีแก้ปัญหาไม่ได้ผลให้ลบโฟลเดอร์. metadata ที่สร้างขึ้นในพื้นที่ทำงานของคุณ สิ่งนี้จะสร้างค่าใช้จ่ายเพิ่มเติมในการนำเข้าโครงการและการกำหนดค่าทุกประเภทที่คุณทำ แต่สิ่งเหล่านี้จะช่วยแก้ปัญหาเหล่านี้ได้อย่างแน่นอน

หวังว่าสิ่งเหล่านี้จะช่วยได้


หมายเหตุ ... การทำเช่นนี้จะทำให้คุณต้องสร้างสภาพแวดล้อมของคุณขึ้นมาใหม่ ดังนั้นในขณะที่สามารถแก้ปัญหาได้เพียงแค่ตระหนักถึงสิ่งที่คุณกำลังจะทำ ...
Bob

0

ขั้นตอนเหล่านี้ใช้ได้ผลสำหรับฉัน

  • ลบเนื้อหาของที่เก็บ Maven ในเครื่อง
  • รันmvn clean installในบรรทัดคำสั่ง (cd ไปยังไดเร็กทอรี pom)
  • สร้างโครงการใน Eclipse

0

1- mvn eclipse: คราส

2- โครงการทำความสะอาดโครงการทั้งหมด

3- เริ่มต้นใหม่


0

เป็นอีกหนึ่งคำตอบที่ควรค่าแก่การกล่าวถึงว่าหากคุณใช้ eGit และ classpath ของคุณได้รับการอัปเดตเนื่องจากเครื่องมือครอบคลุมการทดสอบเช่น Clover ที่บางครั้งอาจมีอาการสะอึกในการล้างข้อมูลที่ไม่ได้ลบเนื้อหาของ /path/to/git/repository/<project name>/bin/

โดยพื้นฐานแล้วฉันใช้มุมมองบันทึกข้อผิดพลาดของ Eclipse ระบุสิ่งที่ทำให้เกิดปัญหาระหว่างการล้างข้อมูลนี้ไปที่ไดเร็กทอรีต้นทางและลบ<project name>/binไดเร็กทอรีด้วยตนเอง เมื่อเสร็จแล้วฉันกลับไปที่ Eclipse และรีเฟรช ( F5) โครงการของฉันและข้อผิดพลาดก็หายไป


0

ตรวจสอบว่าโปรเจ็กต์ของคุณเปิดเป็นโปรเจ็กต์ Maven ไม่ใช่แค่โปรเจ็กต์ Java ปกติ จริงๆแล้วไม่ใช่เกมง่ายๆ แต่นั่นเป็นเหตุผลเดียวกับที่คุณอาจพลาด


0

นอกจากนี้ยังอาจเกิดจาก "[ERROR] ไม่มีคอมไพเลอร์ที่จัดเตรียมไว้ในสภาพแวดล้อมนี้บางทีคุณกำลังรันบน JRE แทนที่จะเป็น JDK?


0

ฉันประสบปัญหาเดียวกัน ฉันแก้ไขได้โดยการลบการพึ่งพา JUnit jar ภายนอกซึ่งฉันเพิ่มโดยดาวน์โหลดจากอินเทอร์เน็ตจากภายนอก แต่แล้วฉันก็ไปที่ project-> properties-> build path-> add library-> junit-> เลือกเวอร์ชัน (เช่น junit4) -> ใช้

มันเพิ่มการพึ่งพาโดยอัตโนมัติ มันช่วยแก้ปัญหาของฉันได้


0

การเปลี่ยนแปลงหุ่นบางส่วนและการบันทึกคลาสทดสอบสามารถแก้ปัญหาได้ มันจะสร้าง. class โดยอัตโนมัติ




0

โปรดตรวจสอบว่าคุณได้เพิ่ม junit4 เป็นการอ้างอิงหรือไม่

เช่น

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

-5

คุณอาจลืมใส่คลาส MainและคลาสTest Caseใน / src / test / java ตรวจสอบครั้งเดียว


1
java.lang.ClassNotFoundException มาเมื่อคลาสถูกคอมไพล์แล้ว แต่ในขณะรันเนื่องจาก classpath ตั้งค่าไม่ถูกต้อง
Nitin Mahesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.