【问题标题】:Correct Approach for Testing class having no default contructor?没有默认构造函数的测试类的正确方法?
【发布时间】:2014-06-30 14:23:36
【问题描述】:

下面是依赖于TableDataDBMetaData 类:

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. 使用反射进行测试。

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

  • 根据 oops 概念,哪一个在架构上更好?

  • 除了以上两种,还有其他可能吗?

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

【问题讨论】:

  • 您不编写默认构造函数。你编写一个无参数构造函数,或者让编译器为你提供一个默认构造函数。
  • 感谢指正
  • 在这种情况下,您不能使用默认构造函数,因为您已经为类创建了构造函数。您可以创建像提到的 Sotirios 这样的无参数构造器来测试您的类
  • 我不明白问题出在哪里。您使用测试中所需的参数调用构造函数,现在调用要测试的方法。为什么需要无参数构造函数?
  • 否则我必须将 DataSource 实例传递给类...我实际上不知道如何编写测试用例。所以我有点卡在这里。我不知道哪种方法更好。它将是 g8如果你能指导我。

标签: java unit-testing testing junit refactoring


【解决方案1】:

我不确定您为什么认为测试需要无参数构造函数。不是。

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

例如,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

【讨论】:

  • 这似乎回答了有关 OP 代码的具体问题。但是假设TableData 是您需要模拟的依赖项以便与另一个 C.U.T. 一起使用它?我冒昧地建议这就是 OP 可能一直在问的问题......(以及我最终来到这里的原因......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2014-10-05
  • 2022-01-01
  • 1970-01-01
  • 2023-03-20
  • 2015-07-07
  • 2012-09-01
相关资源
最近更新 更多