【发布时间】:2013-11-30 20:36:58
【问题描述】:
首先,这是我与 spock 的第一天,所以请耐心等待我 ;-)。
我如何为下面的测试类设置期望值?
class JobThing {
Logger log;
void loppy(Sql sql) {
sql.eachRow("select x from y") {
z -> log.info("${z.x}")
}
}
}
我想假设 select 语句返回“a”然后返回“b”。 这是我想出来的
def "loppy"() {
setup:
def job = new JobThing()
job.log = Mock(Logger)
Sql sql = Mock(Sql)
when:
job.loppy(sql)
then:
//if sql.eachRow(...) is called then call its closure with value "a" then value "b"
1 * sql.eachRow('select x from y') {
// declare expected values here? or where?
}
1 * job.log.info("a")
1 * job.log.info("b")
}
这只是我想出的众多变体之一......直到现在都没有奏效。文档没有多大帮助,因为我似乎没有找到好的关键字来搜索。
谢谢
【问题讨论】:
-
您模拟了 sql 对象并且没有为 eachRow 方法定义行为。不要指望那个模拟自己知道该做什么。但是,即使您已经定义(模拟)了您将测试模拟而不是实现的方法 - 这是毫无意义的。您可以尝试使用 Spy 而不是 Mock,但此时您的实现还没有“测试友好”的设计。
-
如何定义 Sql.eachRow 的行为?我发现很多例子告诉我如何定义返回值,但是如何定义在第一次、第二次、第三次调用时传递给闭包的内容?您能否提供所需的代码?非常感谢!
标签: unit-testing groovy mocking spock