【发布时间】:2014-04-08 14:00:46
【问题描述】:
我很难理解 Groovy 单元测试中的 Spock 交互。
我有以下几种:
public interface Bar {
public String getMessage();
}
public class Foo {
private Bar bar;
public void setBar(Bar bar) {
this.bar = bar;
}
public String getMessage() {
return bar.getMessage();
}
}
然后我编写了以下 Groovy/Spock 测试:
class FooSpec extends Specification {
private Bar bar;
private Foo foo;
def setup() {
bar = Mock(Bar) { getMessage() >> "hello" }
foo = new Foo()
foo.bar = bar
}
def "say hello"() {
expect:
foo.message.equals("hello")
}
def "say goodbye"() {
setup:
bar.getMessage() >> "goodbye"
expect:
foo.message.equals("goodbye")
}
}
代码在设置中创建了一个模拟Bar 实例,初始化Bar.getMessage() 以返回hello,并将其分配给一个新的Foo 实例。
第一个测试验证foo.getMessage() 等于hello。
第二个测试尝试修改bar 模拟,使其getMessage 方法返回goodbye。然后我们期望foo.getMessage()(代表bar.getMessage())将返回goodbye。但是测试失败如下:
FooSpec:say goodbye:26 条件不满足
因为foo.message 仍然等于hello。
我还尝试了以下方法:
def "say goodbye"() {
when:
bar.getMessage() >> "goodbye"
then:
foo.message.equals("goodbye")
}
和:
def "say goodbye"() {
when:
no_op()
then:
bar.getMessage() >> "goodbye"
foo.message.equals("goodbye")
}
但两者都以相同的 hello does not equal goodbye 消息失败。
我可能仍在考虑 Mockito 模式,并假设交互相当于 when(...).thenReturn(...) 表达式,并且以后的交互将覆盖早期的交互。
有没有一种简单的方法使用 Spock 在 setup 方法中声明交互,然后在测试用例中覆盖该交互?还是我需要删除setup() 方法并基本上为每个测试用例添加一个setup: 块?
【问题讨论】:
标签: unit-testing groovy spock