2009-04-09 35 views
35

Tôi có đoạn mã sau:Tại sao phương pháp @BeforeClass của tôi không chạy?

@BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     fail("LOL"); 
    } 

Và phương pháp khác nhau mà là một trong hai @Before, @After, @Test hoặc các phương pháp @AfterClass.

Kiểm tra không thành công khi khởi động như mong muốn. Ai đó có thể giúp tôi xin vui lòng?

Tôi đã JUnit 4,5

Phương pháp này được thất bại trong một cuộc gọi ngay lập tức thiết lập() mà được chú thích như @before. Lớp def là:

public class myTests extends TestCase { 
+0

Bạn có thể xác nhận phiên bản junit nào có trong đường dẫn lớp của mình không? – Peter

+1

Tôi có JUnit 4.5 trong classpath –

Trả lời

59

KHÔNG mở rộng TestCase VÀ sử dụng chú thích cùng một lúc !
Nếu bạn cần để tạo ra một bộ thử nghiệm với các chú thích, sử dụng các chú thích RunWith như:

@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests.class, OtherTest.class }) 
public class AllTests { 
    // empty 
} 


public class MyTests { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
    ... 

(theo quy ước: lớp tên bằng chữ in hoa)

+0

Vâng, đây là một lựa chọn tốt hơn. Không biết về các chú thích @Suite và @RunWith này. 1 và cảm ơn cho đầu vào của bạn. –

+0

cảm ơn. Tôi đã có một thời gian khó khăn để tìm thấy nó tuần trước .. loại chỉ trong thời gian –

+0

Cảm ơn bạn Carlos, hoạt động tốt ngay bây giờ. Cũng cảm ơn cho tất cả sự giúp đỡ của bạn Giấm. –

13

phương pháp must be static và không trực tiếp gọi thất bại (nếu không thì các phương pháp khác sẽ không được thực hiện).

Lớp sau đây cho thấy tất cả các loại JUnit 4 phương pháp tiêu chuẩn:

public class Sample { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("@BeforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("@Before"); 
    } 

    @Test 
    public void test() { 
     System.out.println("@Test"); 
    } 

    @After 
    public void after() { 
     System.out.println("@After"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("@AfterClass"); 
    } 

} 

và ouput là (không đáng ngạc nhiên):

@BeforeClass 
@Before 
@Test 
@After 
@AfterClass 
+0

Bạn là chính xác, cảm ơn, nhưng đã không bắt đầu làm việc khi tôi thay đổi thành tĩnh. –

+0

Hiển thị cho chúng tôi định nghĩa lớp học. Nó có thể là trường hợp lớp của bạn là một lớp con của một số khác, và lớp cha đó có thể có một số phương thức được chú thích là @BeforeClass, và phương thức của lớp cha là kết thúc với một số lỗi và gây dừng. –

+0

Nếu không, hãy thử thêm phương pháp thử bình thường. –

0

Để rằng chức năng trước khi chú thích sẽ chạy, tôi đã phải làm như sau: Nếu bạn sử dụng Maven, thêm một phụ thuộc vào Junit 4.11+:

 <properties> 
       <version.java>1.7</version.java> 
       <version.log4j>1.2.13</version.log4j> 
       <version.mockito>1.9.0</version.mockito> 
       <version.power-mockito>1.4.12</version.power-mockito> 
       <version.junit>4.11</version.junit> 
       <version.power-mockito>1.4.12</version.power-mockito> 
     </properties>   

và phụ thuộc:

 <dependencies> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${version.junit}</version> 
     <scope>test</scope> 
     </dependency>  
     . 
     . 
     . 
     </dependencies> 

Hãy chắc chắn kiểm tra lớp Junit của bạn không được mở rộng Lớp TestCase, vì điều này sẽ gây chồng chéo với phiên bản cũ hơn:

public class TuxedoExceptionMapperTest{ 
    protected TuxedoExceptionMapper subject; 

    @Before 
    public void before() throws Exception { 
    subject = TuxedoExceptionMapper.getInstance(); 
     System.out.println("Start"); 
     MockitoAnnotations.initMocks(this); 
    } 
} 
1

Hãy chắc chắn rằng:

  • lớp thử nghiệm của bạn doesn 't được kế thừa từ TestCase
  • Phương pháp @BeforeClass là tĩnh
  • Bạn làm không có nhiều hơn một phương thức @ BeforeClass trong phân cấp lớp thử nghiệm (chỉ có phương pháp @BeforeClass chuyên biệt nhất sẽ được thực thi)
+0

Chạy jUnit 4.11 cho phép nhiều hơn một @BeforeClass, một trong lớp của bạn và một trong một lớp siêu, và gọi cả hai. – fishjd

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