以下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);
}
.......
}
如何编写这些类的测试用例,因为它们都没有无参数的构造函数。 根据我的理解:
- 要么我必须编写无参数构造函数,要么
- 使用Reflection进行测试。
醇>
我无法理解我应该从上述两种方法中使用什么。
哪一个更好的架构和oops概念?
除上述两种情况外还有其他可能吗?
是否有任何参考或资源可以通过重构来编写测试用例 这种类型的代码?
答案 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对象库,最受欢迎的是EasyMock和Mockito。
这些图书馆的语法略有不同,但在伪编码中,您将如何使用空的ResultSet进行测试。
{{1}}