2012-07-22 44 views
7

Tôi đã viết một giao diện MyInterface, sẽ được triển khai bởi những người triển khai khác nhau.Lớp kiểm tra JUnit chung

Tôi cũng đã viết một lớp MyInterfaceTest, chứa các phương pháp thử nghiệm chung mà tất cả người triển khai sẽ có thể sử dụng để kiểm tra việc triển khai của chúng.

Tôi chỉ không biết cách làm cho nó hoạt động như một bài kiểm tra JUnit.

Hiện nay, tôi có một cái gì đó như thế này:

public class MyInterfaceTest { 
    private static MyInterface theImplementationToTest = null; 

    @BeforeClass public static void setUpBeforeClass() throws Exception { 
       // put your implementation here: 
     theImplementationToTest = new Implementation(...); 
    } 

    @AfterClass public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test public void test1() { /* uses theImplementationToTest */ }  
    @Test public void test2() { /* uses theImplementationToTest */ }  
} 

tôi sử dụng phương pháp tĩnh setUpBeforeClass vì khởi tạo của mỗi thực hiện phải mất rất nhiều thời gian, vì vậy tôi muốn khởi tạo nó một lần cho tất cả các bài kiểm tra.

Với phiên bản thử nghiệm này, người triển khai phải thay đổi mã số setUpBeforeClass và tự triển khai.

Tôi chắc chắn rằng có một cách khác để viết MyInterfaceTest, để người triển khai sẽ chỉ phải kế thừa hoặc gửi thông số và không thay đổi mã. Tuy nhiên, tôi không đủ kinh nghiệm trong JUnit để làm cho nó hoạt động. Bạn có thể vui lòng chỉ cho tôi cách thực hiện điều này không?

Trả lời

6

Bạn có thể có lớp con thực hiện chỉ là phương thức lớp trước và kế thừa tất cả các thử nghiệm.

import org.junit.*; 

public class ImplementingClassTest extends MyInterfaceTest { 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     // put your implementation here: 
     theImplementationToTest = new MyInterfaceImpl(); 
    } 

} 

Điều này làm cho lớp trừu tượng bạn đang viết cái nhìn như:

import org.junit.*; 

public abstract class MyInterfaceTest { 
    protected static MyInterface theImplementationToTest = null; 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test 
    public void test1() { /* uses theImplementationToTest */ 
    } 

    @Test 
    public void test2() { /* uses theImplementationToTest */ 
    } 
} 

Thông thường, bạn sẽ làm cho phương pháp phân lớp cần thiết để thực hiện trừu tượng. Không thể làm điều đó ở đây vì nó là một phương pháp thiết lập tĩnh. (Ngoài ra, bạn có thể muốn cấu trúc lại các instantiation không mất nhiều thời gian vì đây thường là một anti-pattern).

-3

Bạn nên tải xuống tên jar junit-4.10.jar và thêm nó vào dự án của bạn. Sau đó, để lớp học của bạn MyInterfaceTest kế thừa lớp có tên TestCase, như public class MyInterfaceTest extends TestCase.

+1

Điều đó giúp giải quyết vấn đề ban đầu như thế nào? –

+0

Vấn đề ban đầu là gì? –

+0

Cách sử dụng lại thiết lập/teardown tĩnh với việc triển khai thay đổi theo lớp con. Như được mô tả trong câu trả lời của tôi. –

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