[英]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);
}
.......
}
如何編寫這些類的測試用例,因為它們都不具有無參數構造函數。 根據我的理解:
- 我要么寫一個無參數的構造函數,要么
- 通過使用反射進行測試。
我無法從以上兩種方法中理解我應該使用什么。
在架構上和根據概念,哪個更好?
除了以上兩種以外,還有其他可能性嗎?
是否有任何參考或資源通過重構此類代碼來編寫測試用例?
我不確定為什么您認為需要無參數構造函數進行測試。 它不是。
構造函數中的參數是依賴關系 ,單元測試應模擬這些依賴關系,以便您可以測試這些依賴關系可能具有的所有可能變化,這些變化會影響您的被測類。
例如, TableData
采用ResultSet
。 您應該進行一項測試,以檢查TableData
對象是否以空結果集(無行)構造而成。
有幾個針對Java的Mock對象庫,最受歡迎的兩個是EasyMock和Mockito 。
這些庫的語法略有不同,但是在偽代碼中,這是您對空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.