簡體   English   中英

沒有默認構造函數的測試類的正確方法?

[英]Correct Approach for Testing class having no default contructor?

下面是依賴於TableData DBMetaData類:

import javax.sql.DataSource;    
import java.util.HashMap;
import java.util.Map;

public class DBMetaData {

    private DataSource dataSource;
    private Map<String, TableData> tables;
    private static final String[] TYPES = {"TABLE", "VIEW"};

    public DBMetaData(DataSource dataSource) {
        this.dataSource = dataSource;
        this.tables = new HashMap<String, TableData>();
    }
.......

}


public class TableData {
    private String name;
    private Map<String, ColumnData> columns = new HashMap<String, ColumnData>();
    private String catalog;
    private String schema; 

    TableData(ResultSet rs, DatabaseMetaData meta) throws SQLException {
    catalog = rs.getString("TABLE_CAT");
    schema = rs.getString("TABLE_SCHEM");
    name = rs.getString("TABLE_NAME");
    initColumns(meta);
    }
.......
}

如何編寫這些類的測試用例,因為它們都不具有無參數構造函數。 根據我的理解:

  1. 我要么寫一個無參數的構造函數,要么
  2. 通過使用反射進行測試。

我無法從以上兩種方法中理解我應該使用什么。

  • 在架構上和根據概念,哪個更好?

  • 除了以上兩種以外,還有其他可能性嗎?

  • 是否有任何參考或資源通過重構此類代碼來編寫測試用例?

我不確定為什么您認為需要無參數構造函數進行測試。 它不是。

構造函數中的參數是依賴關系 ,單元測試應模擬這些依賴關系,以便您可以測試這些依賴關系可能具有的所有可能變化,這些變化會影響您的被測類。

例如, TableData采用ResultSet 您應該進行一項測試,以檢查TableData對象是否以空結果集(無行)構造而成。

有幾個針對Java的Mock對象庫,最受歡迎的兩個EasyMockMockito

這些庫的語法略有不同,但是在偽代碼中,這是您對空ResultSet進行測試的方式。

//NOTE: Pseduocode, will not compile just meant to give you an idea how it works
@Test
public void emptyResultSet(){

     DataBaseMetaData metadata = ...
     ResultSet emptyResultSet = createMock(ResultSet.class);

     //tell the mock to return false when it's next() method is called.
     //this means there are no rows
     when(emptyResultSet.next()).return(false);

     //cut = Class Under Test
     TableData cut = new TableData(emptyResultSet, metadata);
     //assertions go here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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