2010-11-11 44 views
9

Tôi đang gặp một số vấn đề khi xác định các lớp bên trong một lớp học thử nghiệm kế thừa từ TestCase, cho JUnit 3. Kịch bản là như sau:Lỗi khi định nghĩa các lớp bên trong một lớp học thử nghiệm trong JUnit

Foo.java

public class Foo { 
    public void method() { ... } 
} 

FooTest.java

public class FooTest extends TestCase { 
    public class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

Bây giờ, nếu tôi chạy này từ Eclipse, các bài kiểm tra chạy ok, nhưng nếu tôi cố gắng chạy từ một nhiệm vụ Ant nó không thành công:

[junit] junit.framework.AssertionFailedError: Lớp Foo $ Bar không có constructor nào TestCase (String name) hoặc TestCase()

Bar KHÔNG phải là một class Test, nó chỉ là một lớp con của Foo trọng một số phương pháp mà Tôi không cần phải làm những thứ thực sự khi thử nghiệm.

Tôi khá lạc vào lúc này và tôi không biết cách tiếp cận vấn đề này. Cách duy nhất để tạo các lớp con là độc lập?

+0

Cấu hình Ant của bạn để chạy thử nghiệm là gì? –

Trả lời

15

Điều này là do bạn đã đưa lớp lồng vào tập tin junit. Thêm thuộc tính "loại trừ" vào tệp build.xml của bạn.

Ví dụ:

<target name="test" depends="test-compile"> 
    <junit> 
     <batchtest todir="${test.build.dir}" unless="testcase"> 
      <fileset dir="${test.build.classes}" 
       includes = "**/Test*.class" 
       excludes = "**/*$*.class"/> 
     </batchtest> 
    </junit> 
</target> 
+0

Đây thực sự là một giải pháp tốt hơn so với @Ignore, vì các lớp bên trong không hiển thị ở tất cả trong các tệp kết quả thử nghiệm khi chúng bị loại trừ trong tệp build.xml. Cả hai giải pháp làm việc mặc dù. – joscarsson

+0

Cảm ơn bạn đã trả lời câu hỏi này, bạn đã giúp tôi hiểu tại sao bài kiểm tra junit của kiến ​​lại bị cấm bởi vì tôi có một lớp học riêng tư bên trong. Câu lệnh loại trừ đã thực hiện thủ thuật. – JulianHarty

+0

Tôi tình cờ sử dụng '' với một '' lồng nhau 'với' refid'. Bạn không thể thay đổi '' nhưng bạn vẫn có thể đặt phần tử '' vào '' để loại bỏ các lớp bên trong '' sẽ Đã bao gồm. –

5

Bạn có thể thử xác định lớp Bar như tĩnh:

public class FooTest extends TestCase { 
    public static class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

... nhưng thực tế là nó hoạt động trong một môi trường nhưng không phải trong một gợi ý một trong hai điều:

  1. Java phiên bản
  2. Classpath
  3. [Chỉnh sửa: như đề xuất của Jim bên dưới] Các phiên bản khác nhau của junit.jar
+1

+1 Tôi muốn thêm một số khác: các phiên bản khác nhau của junit.jar. Có thể phiên bản cũ hơn của JUnit bị nhầm lẫn bởi lớp không tĩnh lồng nhau. –

4

Tôi cảm thấy giống như một người necrposter, nhưng vấn đề là tôi đã gặp phải vấn đề tương tự với maven ngày nay.

Thông thường mvn test chạy tốt nhưng khi tôi muốn chạy thử nghiệm từ gói cụ thể như mvn test -Dtest=com.test.* - initializationError bị ném. Điều này "hoạt động" cho cả Junit 3 và 4.

Tôi tìm thấy lý do cho trường hợp maven của tôi, điều này có thể giống nhau đối với kiến. Vấn đề là: theo mặc định plugin của maven (chắc chắn là) chỉ xem xét tập con của tất cả các lớp là "test-classes", cụ thể là tìm kiếm theo tên, như * Test và vv. Khi chúng tôi xác định thuộc tính test, chúng tôi hoàn toàn ghi đè hành vi mặc định. Điều này có nghĩa là với anbom số -Dtest=com.test.* sẽ không chỉ nhận được com.test.MyTestClass mà còn là com.test.MyTestClass.InnerClass và thậm chí com.test.MyTestClass$1 (tức là các lớp ẩn danh).

Vì vậy, để chạy ví dụ: các lớp học từ một số gói bạn nên sử dụng một cái gì đó như -Dtest=com.test.*Test (nếu bạn sử dụng hậu tố để xác định các lớp học thử nghiệm của khóa học).

3

Bạn cũng có thể chú thích các lớp @Ignore lồng nhau nếu bạn không muốn loại trừ tất cả các lớp bên trong.

+1

Điều này không hoạt động đối với các lớp bên trong vô danh. @Ignore Chú thích không hợp lệ tại đây. –

+0

Đúng, nhưng câu hỏi không phải là về các lớp bên trong vô danh. –

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