2010-05-21 30 views
35

Tôi đang cố gắng để chạy một thử nghiệm JUnit từ một lớp Java với:đèo đối số dòng lệnh để test JUnit được chạy theo chương trình

JUnitCore core = new JUnitCore(); 
    core.addListener(new RunListener()); 
    core.run(classToRun); 

Vấn đề là kiểm tra JUnit của tôi đòi hỏi phải có một kết nối cơ sở dữ liệu hiện đang hardcoded trong JUnit tự kiểm tra.

Điều tôi đang tìm là cách chạy kiểm tra JUnit theo trình tự (ở trên) nhưng chuyển kết nối cơ sở dữ liệu đến nó mà tôi tạo trong Lớp Java chạy thử nghiệm và không được mã hóa cứng trong lớp JUnit.

Về cơ bản giống như

JUnitCore core = new JUnitCore(); 
    core.addListener(new RunListener()); 
    core.addParameters(java.sql.Connection); 
    core.run(classToRun); 

Sau đó, trong classToRun:

@Test 
Public void Test1(Connection dbConnection){ 
    Statement st = dbConnection.createStatement(); 
    ResultSet rs = st.executeQuery("select total from dual"); 
    rs.next(); 
    String myTotal = rs.getString("TOTAL"); 
    //btw my tests are selenium testcases:) 
    selenium.isTextPresent(myTotal); 
} 

tôi biết về The @Parameters, nhưng nó dường như không áp dụng ở đây vì nó là hơn để chạy các thử nghiệm cùng trường hợp nhiều lần với các giá trị khác nhau. Tôi muốn tất cả các trường hợp thử nghiệm của tôi chia sẻ một kết nối cơ sở dữ liệu mà tôi truyền vào thông qua một tệp cấu hình cho máy khách java của tôi, sau đó chạy các trường hợp thử nghiệm đó (cũng được chuyển qua tệp cấu hình).

Điều này có khả thi không?

P.S. Tôi hiểu điều này có vẻ giống như một cách kỳ lạ để làm việc.

Trả lời

41

Bạn có thể sử dụng thuộc tính hệ thống java để đạt được điều này.

Đơn giản chỉ cần vượt qua những gì bạn cần với -Dconnectionstring=foobar trong dòng lệnh junit, hoặc sử dụng các api java cho thuộc tính hệ thống để thiết lập này theo chương trình, với System.setProperty(String name, String value), và System.getProperty(String name). Trong các bài kiểm tra, bạn có thể sử dụng @Before hoặc @BeforeClass để thiết lập các đối tượng phổ biến dựa trên thuộc tính này, đang chờ bạn có muốn chạy thiết lập một lần cho mỗi bài kiểm tra hay không (trong trường hợp này bạn có thể sử dụng thành viên lớp) hoặc một lần cho mỗi bộ (và sau đó sử dụng các thành viên tĩnh).

Bạn thậm chí có thể làm tăng hành vi này bằng cách sử dụng lớp trừu tượng mà tất cả các trường hợp thử nghiệm của bạn mở rộng.

+0

Phương thức System.set/getProperty() đủ để chuyển biến cho các lớp thử đang chạy. Cảm ơn bạn! –

+0

Nếu bạn vượt qua các đối số theo cách này -Dconnectionstring = foobar. Làm thế nào bạn có thể giải nén chúng trong thời gian chạy? –

+1

@TomKoptel bạn nhận được giá trị bằng cách sử dụng một cái gì đó như 'String value = System.getProperty (" connectionstring ");' – tonio

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