我对存根初始化感到困惑setup()
和setupSpec()
, 演示:
class SpockTestSpec extends Specification {
@Shared Service service
@Shared MsgClient msgClient
@Shared QueryResult queryResult
def setupSpec() {
msgClient = Stub(MsgClient)
queryResult = Stub(QueryResult)
service = new Service(msgClient: msgClient)
}
def "test1"() {
given:
def msg = "hello world"
def queryId = "abc123"
queryResult.getQueryId() >> queryId
msgClient.submitAsync(_) >> queryResult
when:
def resp = service.query(msg)
then:
resp.getMsg() == msg
resp.getQueryId() == queryId
}
}
它不能工作,因为存根查询结果返回""
,它需要一个查询 Id。 当我使用setup()
时,它运行良好:
class SpockTestSpec extends Specification {
@Shared Service service
@Shared MsgClient msgClient
@Shared QueryResult queryResult
def setup() {
msgClient = Stub(MsgClient)
queryResult = Stub(QueryResult)
service = new Service(msgClient: msgClient)
}
def "test1"() {
given:
def msg = "hello world"
def queryId = "abc123"
queryResult.getQueryId() >> queryId
msgClient.submitAsync(_) >> queryResult
when:
def resp = service.query(msg)
then:
resp.getMsg() == msg
resp.getQueryId() == queryId
}
}
setup()
和setupSpec()
中的初始化存根有什么区别?
Spock 目前的限制是您无法创建可用的@Shared
模拟。模拟创建起来很便宜,所以没有理由分享它们。它将在测试之间引入不必要的耦合。如本期所述,有一种解决方法,但我强烈建议不要这样做。