簡體   English   中英

使用JUnit測試方法

[英]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方法在這里做兩件事。

  1. 執行查詢並獲取結果
  2. 將結果集應用於表。

我將重構為有兩種方法。

  1. public ResultSet getResultSetForQuery(String sql,Statement st)
  2. public Table updateTable(ResultSet rs)

為上述兩種方法編寫測試應該很簡單。

任何良好測試的兩個要點是:

  1. 檢查它是否運作良好
  2. 本地化錯誤(如果存在)

檢查它是否正常工作如果存在錯誤,則將其本地化在您的情況下,由於您的方法執行的操作過於復雜,我們無法執行如此出色的測試以將錯誤本地化(如果存在)。 最好將您的方法重構為幾種方法,以使其更具可讀性和可測試性。 我同意@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
    }

}

有太多的Java庫可用來模擬大型數據,以幫助測試與數據庫相關的方法。 例如Mockito / EasyMock / JMock等。 您可以使用這些庫。 您可以使用工具模擬預期結果,並可以使用預期結果測試方法。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM