Class Not Found Exception khi chạy thử nghiệm JUnit


117

Tôi gặp lỗi này khi chạy kiểm tra JUnit trong 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)

Tôi đã thử thêm JUnitthư viện trong classpath mặc dù tôi đang sử dụng maven và thư viện JUnit nằm trong phần phụ thuộc POM.

Tôi đã thử làm sạch dự án và tạo một trường hợp thử nghiệm JUnit mới bằng cách sử dụng plugin JUnit cho Eclipse, vẫn gặp lỗi tương tự.


10
thử chạy mvn clean testmột lần nó sẽ biên dịch tất cả các lớp học thử nghiệm
Jigar Joshi

1
Bạn có thể vui lòng kiểm tra xem com.myproject.server.MyTest có trong thư mục bin không? Ý tôi là nếu nó không được biên dịch do lỗi đường dẫn biên dịch hoặc xây dựng, bạn sẽ gặp lỗi này.
vikas

bạn đang thử nghiệm một lớp hay toàn bộ dự án?
Doszi89


1
Trong trường hợp của tôi, việc chạy các bài kiểm tra bằng Maven đã hoạt động, nhưng nếu tôi nhấp chuột phải vào một lớp kiểm tra và chọn Run As -> JUnit Test, nó đã báo cáo ClassNotFoundException. Tôi đã sửa nó bằng cách nhấp chuột phải vào dự án và đi tới Thuộc tính -> Người xây dựng và sau đó di chuyển Trình tạo dự án Maven lên trên Trình tạo Java
xorcus

Câu trả lời:


120

Điều này dường như xảy ra vì chỉ mã nguồn đang biên dịch khi bạn sử dụng mvn clean compile(Tôi đang sử dụng maven 3.1.0 nên tôi không chắc liệu nó có luôn hoạt động như thế này không).

Nếu bạn chạy mvn test, mã thử nghiệm cũng sẽ được biên dịch, nhưng sau đó nó sẽ chạy các thử nghiệm (có thể không mong muốn ngay lập tức nếu bạn đang cố chạy chúng thông qua Eclipse.) Cách giải quyết là thêm test-compilevào chuỗi lệnh Maven của bạn bất cứ khi nào bạn làm một mvn clean. Ví dụ, bạn sẽ chạy mvn clean compile test-compile.


1
Tôi đã có điều này xảy ra một lần và câu trả lời của slomek đã hoạt động và sau đó lỗi tương tự lại xảy ra vì vậy tôi cũng phải thử điều này. Bây giờ nó hoạt động tốt trở lại, vì vậy để an toàn, bạn có thể muốn làm cả hai điều này.
Roger

Cảm ơn, nó đã làm việc cho tôi. Nhưng trong trường hợp của tôi, nó không hoạt động cho đến khi đóng và mở lại dự án trong nhật thực.
Paramesh Korrakuti

Nói một cách đơn giản, thực hiện 'biên dịch thử nghiệm sạch mvn' và sau đó chạy các thử nghiệm Junit của bạn trong eclipse. Nó đã làm việc cho tôi. Cảm ơn.
Sreram

103

Tôi đã gặp vấn đề tương tự với các thử nghiệm của mình và tìm thấy ở đâu đó trên Web rằng bạn phải đi tới Đường dẫn xây dựng trong thuộc tính của dự án và di chuyển Phụ thuộc Maven lên trên Thư viện hệ thống JRE . Điều đó dường như đã làm việc cho tôi.


1
Cảm ơn điều này đã giải quyết vấn đề của tôi. Kiểm tra thực tế đã nhận được lỗi không tìm thấy lớp khi tôi cố gắng chạy nó. Tôi nghĩ rằng đây có lẽ là bước đầu tiên tốt hơn trước khi thêm các mục tiêu xây dựng mvn bổ sung.
Roger

8
Phương pháp này được mô tả với ảnh chụp màn hình trong này đường bưu điện (trong trường hợp các bước không rõ ràng từ câu trả lời @ slomek của trên)
nhylated

2
Tôi không thể di chuyển Maven Managed Dependencies lên trên Thư viện hệ thống JRE trong Eclipse Mars 2, nhưng tôi có thể nhấp chuột phải vào dự án và đi tới Thuộc tính -> Người xây dựng và sau đó di chuyển Trình tạo dự án Maven lên trên Trình tạo Java và nó hoạt động với tôi.
xorcus

Tôi đã thử tất cả các cách trên và nó không hoạt động, tôi cũng không thể di chuyển Phụ thuộc Maven về Thư viện hệ thống JRE nhưng điều đó nằm trong tab Thư viện. Sau đó, tôi đi đến Đường dẫn xây dựng -> Đặt hàng & Xuất -> như đã có thể di chuyển Phụ thuộc Maven lên trên thư viện Hệ thống JRE. Sau đó, tôi xây dựng dự án và chạy cài đặt Maven, sau đó thử nghiệm chạy thành công.
Megan

22

Tôi gặp phải vấn đề tương tự và tôi đã có thể khắc phục nó bằng cách sử dụng câu trả lời của @ slomek nhưng vấn đề lại nổi lên sau đó.

Cuối cùng tôi đã sửa nó bằng cách thêm thư mục đầu ra của dự án của tôi vào cấu hình chạy thử nghiệm JUnit. Các bước là:

  • Tìm thư mục đầu ra của dự án của bạn từ Project properties -> Java Build Path -> Default output folder
    • Thông thường đây là <project-folder>/bin
  • Đi đến Run -> Run Configurations...
  • Nhấp vào cấu hình chạy thử nghiệm đơn vị và nhấp vào Classpathtab
  • Thêm rõ ràng thư mục đầu ra của dự án của bạn dưới User Entries- ngay cả khi dự án đã được bao gồm ở đó
    • Nhấp vào Advanced -> Add folderđể thêm thư mục đầu ra

Vấn đề này có thể là do thiết lập dự án kỳ lạ trong Eclipse - ví dụ: thư mục nguồn với các dự án maven lồng nhau được nhập dưới dạng một dự án / thư mục duy nhất (ít nhất đó là cách dự án của tôi được thiết lập).


Cảm ơn bạn rất nhiều; Tôi đã có vấn đề này. Bản sửa lỗi của bạn đã làm việc cho tôi; hai người hàng đầu thì không. Đã bình chọn.
davtom

Hoàn toàn rực rỡ! Tôi đã gãi đầu trong nhiều năm qua chuyện này. Cảm ơn!
RayCh

17

Nếu sự cố này chỉ xảy ra trong Eclipse, việc thực thi lệnh Project -> Clean ... trên dự án đã chọn có thể hữu ích.


Cảm ơn - nó thực sự làm việc cho tôi - Jave EE nhật thực gradlew
Abdeali Chandanwala

11

Sau khi đã thử mọi thứ ở đây mà không có cải thiện, tôi đã giải quyết vấn đề của mình bằng cách khởi động lại Eclipse


5

Tôi đã khắc phục sự cố của mình bằng cách chạy cập nhật maven. Nhấp chuột phải vào dự án của bạn> Maven> Cập nhật dự án


3

Trong trường hợp của tôi, tôi có cấu trúc thư mục maven sai.

Nó sẽ như thế nào:

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

Sau khi tôi sửa điều đó - mọi thứ hoạt động như một cái duyên.


2

Trong trường hợp của tôi, chỉ có các bước tiếp theo giúp tôi giải quyết vấn đề này:

  1. Project-> properties-> Run / Debug Settings.
  2. Trong "Khởi chạy cấu hình cho '.....'", hãy chọn các lớp / dự án
  3. Chỉnh sửa -> Classpath -> "Khôi phục các mục nhập mặc định"

Cảm ơn!! Chỉ cái này giúp tôi !!
sumandas

1

Trước đó, trong trường hợp này, tôi luôn thực hiện mvn eclipse:eclipsevà khởi động lại Eclipse của mình và nó hoạt động. Sau khi chuyển sang GIT, nó ngừng hoạt động đối với tôi, điều này hơi kỳ lạ.

Vấn đề cơ bản ở đây là Mr Eclipse không tìm thấy lớp đã biên dịch. Sau đó, tôi đặt thư mục đầu ra là Project / target / test-class được tạo theo mặc định bởi mvn clean installkhông bỏ qua kiểm tra và tiếp tục với cách giải quyết sau:

Tùy chọn 1: Đặt classpath cho mỗi trường hợp thử nghiệm

Eclipse -> Run -> Run Configurations -> trong JUnit-> chọn mytest -> dưới tab classpath-> Chọn User Entries-> Advanced-> Add Folder -> Select -> Apply-> Run

Tùy chọn 2: Tạo biến classpath và đưa nó vào classpath cho tất cả các trường hợp thử nghiệm

Eclipse -> Windows -> Biến Classpath -> Mới -> [Tên: Junit_test_case_cp | path:] -> ok Sau đó vào Eclipse-> Run -> Run Configurations -> JUnit-> chọn mytest -> dưới tab classpath -> Chọn User Entries-> Advanced-> Thêm biến classpath-> Chọn Junit_test_case_cp-> ok- > Áp dụng-> Chạy

Đây là điều duy nhất hiện đang làm việc cho tôi sau khi thử tất cả các đề xuất trực tuyến.


1

Tôi đã gặp vấn đề tương tự với dự án Gradle có Bộ nguồn thử nghiệm với hai thư mục tài nguyên.

Đoạn mã này đến từ main-module.gradle và thêm một tệp tài nguyên vào SourceSet thử nghiệm:

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

Làm điều này, tôi đã có hai thư mục tài nguyên liên quan đến Bộ nguồn thử nghiệm của mô-đun chính của dự án:

../other-module/src/test/resources src / test / resources (liên quan đến thư mục mô-đun chính, do plugin java tự động thêm vào)

Tôi phát hiện ra rằng nếu tôi có hai tệp có cùng tên trong cả hai thư mục nguồn, thì đã xảy ra lỗi trong giai đoạn tài nguyên quy trình. Kết quả là không có quá trình biên dịch nào được bắt đầu và vì lý do này, không có .class nào được sao chép trong thư mục bin, nơi JUnit đang tìm kiếm các lớp. ClassNotFoundException biến mất chỉ đổi tên một trong hai tệp.


1

NoClassDefFoundError thực sự có nghĩa là nó không thể khởi tạo lớp. Nó không có gì đến việc tìm kiếm lớp học. Tôi gặp lỗi này khi gọi trim () trên Chuỗi null.

JUnit sẽ không hiển thị NullPointerException. Chuỗi không rỗng khi chạy bình thường vì tôi đang tìm nạp chuỗi từ tệp thuộc tính không khả dụng cho các thử nghiệm.

Lời khuyên của tôi là loại bỏ các phần khỏi lớp học cho đến khi các bài kiểm tra của bạn bắt đầu trôi qua. Sau đó, bạn có thể xác định dòng nào đang báo lỗi.


0

Tôi đã gặp sự cố tương tự với Eclipse Helios của mình để gỡ lỗi Junits. Vấn đề của tôi hơi khác khi tôi có thể chạy Junits thành công nhưng khi tôi nhận được ClassNotFoundException trong khi gỡ lỗi các JUNIT giống nhau.

Tôi đã thử tất cả các loại giải pháp khác nhau có sẵn trong Stackoverflow.com và các diễn đàn ở những nơi khác, nhưng dường như không có gì hoạt động. Sau khi đập đầu với những vấn đề này trong gần hai ngày, cuối cùng tôi đã tìm ra giải pháp cho nó.

Nếu không có giải pháp nào có vẻ hiệu quả, chỉ cần xóa thư mục .metadata được tạo trong không gian làm việc của bạn. Điều này sẽ tạo thêm chi phí nhập các dự án và tất cả các loại cấu hình mà bạn đã thực hiện, nhưng những điều này chắc chắn sẽ giải quyết được vấn đề này.

Hy vọng những điều này sẽ giúp.


Như một lưu ý ... làm điều này sẽ yêu cầu bạn xây dựng lại môi trường của mình. Vì vậy, mặc dù có thể giải quyết vấn đề này, chỉ cần lưu ý những gì bạn sắp làm ...
Bob

0

Những bước này đã làm việc cho tôi.

  • Xóa nội dung của kho lưu trữ Maven cục bộ.
  • chạy mvn clean install trong dòng lệnh. (cd vào thư mục pom).
  • Xây dựng dự án trong Eclipse.

0

1- mvn eclipse: nhật thực

2- dự án làm sạch tất cả các dự án

3- khởi động lại


0

Điều đáng nói là một câu trả lời khác rằng nếu bạn đang sử dụng eGit và đường dẫn classpath của bạn được cập nhật vì nói rằng, một công cụ kiểm tra phạm vi bảo hiểm như Clover, đôi khi có một trục trặc dọn dẹp không xóa hoàn toàn nội dung của /path/to/git/repository/<project name>/bin/

Về cơ bản, tôi đã sử dụng Dạng xem nhật ký lỗi của Eclipse, xác định nguyên nhân gây ra sự cố trong nỗ lực dọn dẹp này, điều hướng đến thư mục nguồn và xóa <project name>/binthư mục theo cách thủ công . Sau khi hoàn tất, tôi quay lại Eclipse và làm mới ( F5) dự án của mình và lỗi đã biến mất.


0

Kiểm tra xem dự án của bạn có được mở dưới dạng dự án Maven không chỉ là một dự án Java thông thường. Thực sự là không có trí tuệ, nhưng đó chính xác là lý do tại sao bạn có thể bỏ lỡ nó.


0

Nó cũng có thể là do "[LỖI] Không có trình biên dịch nào được cung cấp trong môi trường này. Có lẽ bạn đang chạy trên JRE chứ không phải JDK?"


0

Tôi đã phải đối mặt với cùng một vấn đề. Tôi đã giải quyết nó bằng cách loại bỏ phụ thuộc jar JUnit bên ngoài mà tôi đã thêm bằng cách tải xuống từ internet bên ngoài. Nhưng sau đó tôi vào dự án-> thuộc tính-> xây dựng đường dẫn-> thêm thư viện-> junit-> chọn phiên bản (ví dụ: junit4) -> áp dụng.

Nó tự động thêm phần phụ thuộc. nó đã giải quyết vấn đề của tôi.


0

Thực hiện một số thay đổi giả và lưu lớp thử nghiệm có thể giải quyết vấn đề. Nó sẽ tự động xây dựng lớp .class


0

Có vẻ như vấn đề biên dịch. Chạy dự án dưới dạng thử nghiệm Maven, sau đó Chạy dưới dạng thử nghiệm JUnit.



0

Vui lòng kiểm tra xem bạn đã thêm junit4 làm phụ thuộc chưa.

ví dụ

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

-5

Có thể bạn đã quên đặt lớp Mainlớp Test Case trong / src / test / java. Kiểm tra nó một lần.


1
java.lang.ClassNotFoundException đến khi lớp đã được biên dịch nhưng trong thời gian chạy do classpath không được đặt đúng cách.
Nitin Mahesh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.