测试没有默认构造函数的类的正确方法?

时间:2014-06-30 14:23:37

标签: java unit-testing testing junit refactoring

以下DBMetaData类取决于TableData

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.   
  3. 使用Reflection进行测试。
  4.   

我无法理解我应该从上述两种方法中使用什么。

  • 哪一个更好的架构和oops概念?

  • 除上述两种情况外还有其他可能吗?

  • 是否有任何参考或资源可以通过重构来编写测试用例 这种类型的代码?

1 个答案:

答案 0 :(得分:0)

我不确定为什么你认为测试需要无参数构造函数。事实并非如此。

构造函数中的参数是 dependencies ,并且您的单元测试应该模拟这些依赖项,以便您可以测试这些依赖项可能会影响您的测试类的所有可能变体。

例如,TableData需要ResultSet。如果使用空结果集(没有行)构造TableData对象,则应该进行检查以确保//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 对象正常工作。

java有几个Mock对象库,最受欢迎的是EasyMockMockito

这些图书馆的语法略有不同,但在伪编码中,您将如何使用空的ResultSet进行测试。

{{1}}