2010-10-25 29 views
23

Tôi nhận được ngoại lệ sau đây từ một trường hợp thử nghiệm chạy thành công trước đây nhưng bây giờ nó ném ngoại lệ này:JUnit java.lang.NoSuchMethodError: junit.framework.ComparisonFailure.getExpected() Ljava/lang/String

java.lang.NoSuchMethodError: junit.framework.ComparisonFailure.getExpected()Ljava/lang/String; 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.java:63) 
    at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:100) 
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:41) 
    at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:97) 
    at org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener.addError(JUnit38ClassRunner.java:41) 
    at org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener.addFailure(JUnit38ClassRunner.java:64) 
    at junit.framework.TestResult.addFailure(TestResult.java:46) 
    at junit.framework.TestResult.runProtected(TestResult.java:127) 
    at junit.framework.TestResult.run(TestResult.java:109) 
    at junit.framework.TestCase.run(TestCase.java:118) 
    at junit.framework.TestSuite.runTest(TestSuite.java:208) 
    at junit.framework.TestSuite.run(TestSuite.java:203) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    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) 

Bất cứ ai biết điều gì đang gây ra điều này? Nó có vẻ như là một vấn đề nội bộ với nhân vật JUnit.

+0

bạn có thể đăng mã tại dòng bị lỗi không? – hvgotcodes

+0

bạn đang sử dụng phiên bản junit nào? Có vẻ như những người khác đã thấy điều này với 4.5. –

+0

Rất tiếc, tôi không thể đăng toàn bộ phương thức thử vì nó chứa một số logic nghiệp vụ. Tuy nhiên không có gì bất thường về các xác nhận chỉ đơn giản là assertEquals(). Dấu vết ngăn xếp không cho tôi một dòng cụ thể từ lớp thử nghiệm mà nó không thành công. Thử nghiệm chạy tốt trước khi tôi không chắc chắn tại sao nó ném ngoại lệ này. Tôi chưa bao giờ thấy ngoại lệ này trước đây. – TheWolf

Trả lời

20

Phương pháp getExpected() trên junit.framework.ComparisonFailure chỉ được thêm vào trong JUnit 3.8.2 (hãy nhớ, junit.framework gói là từ JUnit 3.8, trong khi JUnit 4 sử dụng org.junit). Phương pháp này không có trong 3.8.1, đây là phiên bản phổ biến nhất của 3.x vẫn tồn tại.

Tôi nghĩ phương pháp đã được thêm vào để di chuyển dễ dàng hơn vào công cụ JUnit 4 và đôi khi ngoại lệ này bật lên trên các cơ sở mã cũ hơn sử dụng JUnit 3.8. Á hậu thử nghiệm JUnit 4 Eclipse sẽ xuất hiện để chuyển trở lại để gọi mã junit.framework.* khi chạy thử nghiệm JUnit 3.8.

SO Tôi đoán bạn vẫn có JUnit 3.8.1 ẩn trên đường dẫn lớp của bạn và nó đang xung đột với trình kiểm tra Eclipse. Hoặc loại bỏ JAR đó, hoặc "nâng cấp" nó lên 3.8.2.

+0

Nếu bạn không thấy nó trong các phụ thuộc dự án của bạn thì một trong các thư viện có thể đang sử dụng 3.8. Nếu bạn không thể xóa thư viện từ đó, hãy thử sử dụng chú thích @RunWith (JUnit4.class). –

12

này cũng có thể xảy ra nếu bạn đang sử dụng JUnit 4 nhưng nhập khẩu các lớp Assert từ junit.framework gói cũ (chứ không phải là org.junit gói mới)

Kiểm tra cả nhập khẩu và nhập khẩu tĩnh của bạn - thủ phạm đối với tôi là import static junit.framework.Assert.assertEquals;

+1

thankyou! Tôi đã làm chính xác điều tương tự :) –

+0

Xem thêm: http://stackoverflow.com/questions/291003/differences-between-2-junit-assert-classes –

5

Lỗi tương tự xảy ra với tôi khi chạy lớp thử nghiệm của tôi trong nhật thực nhưng giải pháp của tôi hơi khác.

Thiết lập của tôi là tôi đã có junit-4.10 jar trong classpath nhưng lớp thử nghiệm của tôi đã sử dụng junit 3 và ngoại lệ chỉ xảy ra nếu phương thức assertEquals thất bại.

Vấn đề là nhật thực vẫn đang sử dụng runner junit 4 vì vậy tôi đã thay đổi cấu hình bằng cách chọn "Chạy cấu hình" trong nhật thực, sau đó chọn lớp thử nghiệm và sau đó thay đổi "Test Runner" trong trình đơn thả xuống từ "JUnit 4" đến "JUnit 3").

1

Tôi cũng gặp sự cố, nhưng đó là vì tôi đã sử dụng JUnit 4.1. Tôi chuyển sang 4.4 và vấn đề đã biến mất.

0

Tôi chỉ gặp sự cố sau khi nâng cấp lên phiên bản Eclipse của Kepler. Bài kiểm tra sẽ chạy tốt nếu tôi chạy thử nghiệm "Tất cả". Nhưng khi tôi chạy một thử nghiệm phương pháp duy nhất nó sẽ thất bại với lỗi này.

Tôi tìm thấy câu trả lời này và nghĩ rằng tôi muốn chia sẻ câu trả lời ở đây để giúp đỡ người khác trong tương lai. Dài và ngắn của nó được nâng cấp lên Junit 4.4 hoặc tốt hơn

https://www.gotraveltech.com/confluence/display/COOK/My+Eclipse Cuộn xuống "Làm cách nào để chạy các thử nghiệm JUnit 4.x.x riêng lẻ trong MyEclipse?"

3

Sự cố trong trường hợp của tôi là junit-4.5.jar được thêm trực tiếp dưới dạng thư viện vào dự án.

Giải pháp của tôi là xóa phụ thuộc vào bình junit khỏi dự án Eclipse và dựa vào thư viện plugin JUnit. Điều đó được thêm tự động hoặc có thể được thêm bằng tay bằng cách nhấp vào nút Thêm Thư viện trên màn hình thư viện của dự án.

Đó là một mất JUnit từ plugin và có một tham chiếu tương tự như sau:

.../Eclipse/plugins/org.junit_4.12.0.v201504281640 

Đó cũng là cần thiết để di chuyển các thư viện JUnit trên đầu danh sách theo thứ tự và tab Export. Chọn hộp kiểm xuất không cần thiết.

0

Kiểm tra phụ thuộc và thư viện đã nhập là phiên bản hiệu quả nhất trong trường hợp này.

Ví dụ: @Test chú thích có thể được nhập từ org.junit.Test và không phải @org.testng.annotations.Test. Đối với dự án Android, điều này có thể dẫn đến lỗi như:

Exception in thread "main" java.lang.NoSuchMethodError: ...

Các vấn đề liên quan