在測試用例中通過setUp()、tearDown()創建測試固件,只能使這個測試固件在單個測試用例的不同測試方法中共用,假如有多個測試用例都需要使用相同的測試固件,就需要將測試固件抽取到一個獨立的類中。JBuilder提供了3個預定義的測試固件類,它們分別是:
<!-- frame contents -->
<!-- /frame contents -->
·JDBC測試固件(JDBC Fixture):用於獲取數據庫連接的測試固件,用戶僅需要通過設置一些數據庫信息,就可以用方便的方法獲取數據連接。
·JNDI 測試固件(JNDI Fixture):用於模擬從JDNI環境中獲取對象的測試固件。
·比較測試固件(Comparision Fixture):將測試輸出到外部文件中,以便第二次測試時進行比較。
·自定義測試固件(Custom Fixture):用戶自定義的測試固件。
假如對JUnit的框架結構非常了解,也許這些JBuilder擴展的測試固件對你來說意義並不大,它們無非是構建一些常見的測試環境罷了,你完全可以自己編寫。在本節裡,我們介紹兩個測試固件。
JDBC測試固件 假如你的工程中已經有一個獲取數據連接的公共類,你也有必要構建一個JDBC測試固件,因為JDBC測試固件不但可以直接通過創建測試用例的向導直接指定,此外,JDBC測試固件還提供了許多面向測試的方法。
為了創建JDBC測試固件,我們先創建一個JDataStore的數據庫,其數據文件位於<chapter25工程目錄>/db/hr.jds,這個數據庫的用戶名和密碼是:sysdba/123456。hr.jds數據庫中有一張EMPLOYEE的表,其結構如下所示:
圖 錯誤!文檔中沒有指定樣式的文字。EMPLOYEE表的數據
EMPLOYEE有3個字段,分別是ID、NAME和AGE,分別是String、String和int類型,並按上圖所示填入3條記錄。
為了演示JDBC測試固件的具體使用,我們設計兩個業務類:Employee和EmployeeDAO,爾後用JDBC測試固件為測試EmployeeDAO提供數據連接。這兩個類的代碼如下:
代碼清單 錯誤!文檔中沒有指定樣式的文字。Employee.Java類
1. package chapter25.db;
2. public class Employee
3. {
4. private String id;
5. private String name;
6. private int age;
7. public Employee(String id, String name, int age) {
8. this.id = id;
9. this.name = name;
10. this.age = age;
11. }
12. public String getId() {
13. return id;
14. }
15. public String getName() {
16. return name;
17. }
18. public int getAge() {
19. return age;
20. }
21. public boolean equals(Object o) {
22. if (o instanceof Employee) {
23. Employee e1 = (Employee) o;
24. return id.equals(e1.getId()) && name.equals(e1.getName()) &&age == e1.getAge();
25. } else {
26. return false;
27. }
28. }
29. }
Employee類用於描述EMPLOYEE表的一條記錄,該類訪問數據庫的EmployeeDAO代碼如下所示:
代碼清單 錯誤!文檔中沒有指定樣式的文字。EmployeeDAO.java類
1. package chapter25.db;
2. import java.sql.*;
3. public class EmployeeDAO
4. {
5. private Connection conn;
6. public EmployeeDAO(Connection conn) {
7. this.conn = conn;
8. }
9. public Employee findById(String id) throws SQLException
10. {
11. String sqlStr = "select * from employee where id ='"+id+"'";
12. Statement stat = conn.createStatement();
13. ResultSet rs = stat.executeQuery(sqlStr);
14. if (rs.next()) {