unit-testing - Spock交互验证忽略对Mock方法的调用
问题描述
以下 Spock 测试未能不计算对 Mock 方法的调用:
def setup() {
mojo = new PactCreateVersionTagMojo()
mojo.pactBrokerUrl = 'http://broker:1234'
mojo.pacticipant = 'test'
mojo.pacticipantVersion = '1234'
mojo.tag = 'testTag'
}
def 'calls pact broker client with mandatory arguments'() {
given:
mojo.brokerClient = Mock(PactBrokerClient)
when:
mojo.execute()
then:
notThrown(MojoExecutionException)
1 * mojo.brokerClient.createVersionTag(
'test', '1234', 'testTag')
}
你可以在这里找到它。
删除参数验证代码的 SUT 代码是:
class PactCreateVersionTagMojo : PactBaseMojo() {
override fun execute() {
...
createVersionTag()
}
private fun createVersionTag() =
brokerClient!!.createVersionTag(pacticipant!!, pacticipantVersion.orEmpty(), tag.orEmpty())
你可以在这里找到它。
错误如下:
我在同一个项目上有一个非常相似的例子,它通过得很好:
def 'passes optional parameters to the pact broker client'() {
given:
mojo.latest = 'true'
mojo.to = 'prod'
mojo.brokerClient = Mock(PactBrokerClient)
when:
mojo.execute()
then:
notThrown(MojoExecutionException)
1 * mojo.brokerClient.canIDeploy('test', '1234',
new Latest.UseLatest(true), 'prod') >> new CanIDeployResult(true, '', '')
}
override fun execute() {
...
val result = brokerClient!!.canIDeploy(pacticipant!!, pacticipantVersion.orEmpty(), latest, to)
}
我已经调查了测试期间发生的呼叫,并且看起来符合预期。此外,我尝试使用通配符参数约束创建验证,但它仍然不起作用。
在我看来,我的测试配置错误,但我无法发现通过的测试和失败的测试之间的区别。
解决方案
你fun createVersionTag(..)
看起来像这样:
fun createVersionTag(
pacticipant: String,
pacticipantVersion: String,
tag: String) {
}
我不会说 Kotlin,但我认为你应该使用open
该方法,因为否则它是最终的,这意味着它不能被子类覆盖,因此不能被传统方法模拟或存根。这也是与 的区别open fun canIDeploy(..)
。
推荐阅读
- c# - 序列号生成器,每次启动应用程序时从 0 开始
- mysql - 节点 MySQL 异步执行查询
- java - 地理Java的小数点到=>度/分/秒
- go - 自定义切片类型和底层类型之间的赋值
- jenkins - 无法在 GitHub 中添加 SSH 密钥
- c++ - 使用 Teechart 最简单、最快地绘制 sigmoid 曲线
- group-by - where expression group by (col) vs group by (col) 有表达式
- javascript - 如何仅使用 Javascript 一次显示一个数组元素?
- android - Android - 在没有 onActivityResult() 的情况下从活动传回信息的最佳做法是什么?
- java - 理解增量和减量