通过模拟jdbc对Java代码进行Spock测试

时间:2017-09-18 07:58:45

标签: unit-testing spock

我有一个课程如下 -

@Repository
public class TableImpl implements Table{
@Autowired
DataSource dataSource;
@Autowired
DataSource dataSource2;
private static List<Object> tableInfo;
public List<Object> getTableInfo() {
    return tableInfo;
}
public void setTableInfo(List<Object> tableInfo) {
    this.tableInfo = tableInfo;
}
public List<String> fetchColumns(BasicDataSource dataSource){
    JdbcTemplate jdbctemplate = new JdbcTemplate(dataSource);
    List<Map<String, Object>> columnMap = jdbctemplate.queryForList("show columns from " + tableInfo.get(0).toString());
    List<String> columns = new ArrayList<String>();
    for (Map<String, Object> column: columnMap)
    {
        columns.add(column.get("FIELD").toString());
    }
    return columns;
    }}

我想在spock中为方法fetchColumns写一个测试。

这是我尝试的但这不起作用 -

class TableImplSpec extends spock.lang.Specification{

JdbcTemplate jdbcTemplate=Mock()
DataSource dataSource1=Mock()

def List<Object> tableInfo=[1]
def BasicDataSource dataSourceValue
def BasicDataSource dataSource
def TableImpl obj=new TableImpl(
    dataSource: dataSource1
    )
def Table obj1=new TableImpl(
    dataSource: dataSource1,tableInfo: tableInfo
    )
List<Map<String, Object>> recordsList
    def "fetch columns"()
{
    given:
    TableImpl TableImplMock = Mock()
    def Table obj2=new TableImpl(
        dataSource: dataSource1,tableInfo: tableInfo
        )
     tableInfo.add(0,"promptpaySched")
     tableInfo.add(1,"promptpaySchedID")
     tableInfo.add(2,"name,lastname")
     tableInfo.add(3,1)
     jdbcTemplate.queryForList(_ as String)>> null
    when:
    obj2.fetchColumns(dataSource)
    then:
    1*jdbcTemplate.queryForList(_ as String)
}}

我得到的错误是--- IllegalArgumentException:属性'dataSource'是必需的。我完全不知道我要对我的测试班做出哪些改变。

1 个答案:

答案 0 :(得分:0)

如果您正在为与数据库交互的代码编写测试(即从中读取数据或将数据存储到其中),您可能需要调整测试以传递实际的dataSource(而不是模拟的数据)。 否则尝试在Repository级别进行模拟并使用它来返回预期的对象。