【发布时间】:2016-02-09 18:52:53
【问题描述】:
我正在尝试模拟 groovy.sql.Sql call(query, params[],closure) 类。 下面是我正在尝试的 DatabaseService 类文件中的方法。
public void getUsers(List<User> developerList, Sql sql) {
sql.call("{? = call GETUSERS()}", [Sql.resultSet(OracleTypes.CURSOR)]) { result ->
while (result.next()) {
User user = new User()
user .email = result.EMAIL
user .lastName = result.LASTNAME
}
}
}
我的模拟确实完成了任务,但是,我不希望模拟的闭包执行。我想模拟 .call(,,_) 方法以仅跳过数据库逻辑,并将列表返回给 getUsers() 方法中的闭包。我希望闭包在 getUsers() 方法中执行,而不是在模拟方法中执行。
下面是我用 SPOCK 编写的模型。
void "test getUsers(list,sql) some results"() {
DataSource mockedSource = Mock(DataSource)
Sql mockedSql = Mock(Sql)
DatabaseService databaseService = new DatabaseService()
databaseService.dataSource = mockedSource
List<User> userList= new ArrayList<>();
when:
databaseService.getUsers(userList, mockedSql)
then:
1 * mockedSql.call(_, _, _) >> { return [[EMAIL: "A", LASTNAME: "B"]] }
userList.size() == 1
}
正如想象的那样,这个模型覆盖了原来的方法闭包,我的列表永远不会被填充。我当然不想重写我的类来使用 Java,我也不能更改执行的存储过程。
【问题讨论】:
-
为什么不只是模拟服务方法只返回列表
-
因为这不会测试关闭是否有效
-
嗯...我要么伪造数据源,要么提取闭包以便测试
标签: grails groovy mocking spock