【发布时间】:2016-08-10 05:37:44
【问题描述】:
我正在使用 Spock 测试框架。我有很多类似这样结构的测试:
def "test"() {
when:
doSomething()
then:
1 * mock.method1(...)
2 * mock.method2(...)
}
我想将“then”块的代码移动到辅助方法中:
def assertMockMethodsInvocations() {
1 * mock.method1(...)
2 * mock.method2(...)
}
然后调用这个辅助方法来消除我的规范中的重复代码如下:
def "test"() {
when:
doSomething()
then:
assertMockMethodsInvocations()
}
但是,将 n * mock.method(...) 放入辅助方法时,我无法匹配方法调用。下面的例子演示:
// groovy code
class NoInvocationsDemo extends Specification {
def DummyService service
def "test"() {
service = Mock()
when:
service.say("hello")
service.say("world")
then:
assertService()
}
private assertService() {
1 * service.say("hello")
1 * service.say("world")
true
}
}
// java code
public interface DummyService {
void say(String msg);
}
// [RESULT]
// Too few invocations for:
//
// 1 * service.say("hello") (0 invocations)
//
// Unmatched invocations (ordered by similarity):
//
// 1 * service.say('hello')
// 1 * service.say('world')
//
// Too few invocations for:
//
// 1 * service.say("world") (0 invocations)
//
// Unmatched invocations (ordered by similarity):
//
// 1 * service.say('world')
// 1 * service.say('hello')
如何从then: 块中删除重复的代码?
【问题讨论】:
-
很好,但是您有问题吗?
-
此功能无法使用,因为
n * mock.method(...)是语法糖。如果您在另一种方法中使用它,它将无法按预期工作。它们不会捕获任何方法调用。 @ScaryWombat