[英]Test a method with JUnit
如何測試此方法:
public void updateTable() {
try {
String sql = "select * from userDetails";
rs = st.executeQuery(sql);
st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
table.setModel(DbUtils.resultSetToTableModel(rs));
}
catch(Exception e) {
}
很少有建議可以使其更具可測試性。
updateTable
方法在這里做兩件事。
我將重構為有兩種方法。
public ResultSet getResultSetForQuery(String sql,Statement st)
public Table updateTable(ResultSet rs)
為上述兩種方法編寫測試應該很簡單。
任何良好測試的兩個要點是:
檢查它是否正常工作如果存在錯誤,則將其本地化在您的情況下,由於您的方法執行的操作過於復雜,我們無法執行如此出色的測試以將錯誤本地化(如果存在)。 最好將您的方法重構為幾種方法,以使其更具可讀性和可測試性。 我同意@AjayGeorge關於分離該方法的方法。
然后,您可以編寫如下內容:
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.sql.ResultSet;
public class TestExample {
@BeforeClass
public static void setup() {
// init your connection here
// and insert data for tests
}
@AfterClass
public static void cleanup() {
// close connection
}
@Test
public void testTableUpdate() {
// initialize 'sqlQuery' and 'statement'
ResultSet resultSet = getResultSetForQuery(sqlQuery, statement);
// check 'resultSet' with JUnit methods like assertTrue
updateTable(resultSet);
// check that table is filled as you expected
}
}
JUnit:通常,您編寫如下的測試類,並使用@Test注釋包含測試的方法。 如果要編寫必須失敗的測試,則可以使用批注的'expected'屬性。 如果您知道測試可能運行了太長時間,並且希望它在特定時間段后超時,請使用批注中的'timeout'屬性。
如果在每個測試方法之前都有確定初始化的邏輯,則可以將其放入另一個方法中,並使用@Before對其進行注釋。 同樣,要釋放內容,請使用@After。 對於每個測試類將運行一次的初始化,請使用批注@BeforeClass並確保該方法是公共的和靜態的-與@AfterClass相同。
通常,在每種測試方法中,您都將像這樣:執行一些代碼,然后對預期情況進行斷言。 在我的示例中,我正在測試方法“ myAdd”,我希望1 + 1等於兩個2。
public class MyTest {
@Test
public void testAddition() {
int sum = myAdd(1, 1);
assertEquals(2, sum);
}
}
此示例基於JUnit: https : //github.com/junit-team/junit/wiki還有其他替代方法,例如TestNG: http : //testng.org/doc/index.html
如果要測試某個類相對於其依賴關系的行為,建議使用模擬框架。 示例包括:jmock,mockito等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.