groovy - 在 Gradle 的单元测试中使用 Spock 通配符的问题
问题描述
我在 Eclipse 2021-03 (4.19.0) 中使用 Spock 2.0-M4-groovy-3.0 和 Groovy 3.0.7。在单元测试中,我尝试创建一个像这样的 Mock:
1 * mockGoogleCalendarClient.bookTimeSlot(_)
实际代码需要一个具有多个字段的对象。我不关心对象,所以我想使用通配符。
当它运行时,我得到这个:
测试没有定义或继承接口 groovy.lang.GroovyObject 的已解析方法“抽象 java.lang.Object getProperty(java.lang.String)”的实现。
这只发生在我在测试中使用通配符时。我试图找出这个错误,但到目前为止我还没有。为了取得进展,我将所描述的方法添加到测试中,如下所示:
@Override
public Object getProperty(String value)
{
return new Object()
}
现在测试运行,但似乎没有与通配符匹配。偶然我在该方法上设置了一个断点,以查看传递给它的内容(如果有的话),结果是“_”。就好像Spock在问价值应该是什么。
为什么测试首先会出现这个问题?
解决方案
在https://github.com/jeffbrown/toronaga07spock是一个工作示例。
plugins {
id 'groovy'
}
repositories {
jcenter()
}
dependencies {
implementation 'org.codehaus.groovy:groovy-all:3.0.7'
testImplementation 'org.spockframework:spock-core:2.0-M4-groovy-3.0'
}
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}
src/main/groovy/toronaga07spock/CalendarHelper.groovy
package toronaga07spock
class CalendarHelper {
CalendarClient client
void book(String message) {
client.bookTimeSlot message
}
}
src/main/groovy/toronaga07spock/CalendarClient.groovy
package toronaga07spock
interface CalendarClient {
void bookTimeSlot(String s)
}
src/test/groovy/toronaga07spock/CalendarHelperSpec.groovy
package toronaga07spock
import spock.lang.Specification
class CalendarHelperSpec extends Specification {
def "test a basic mock"() {
given:
def helper = new CalendarHelper()
def mockGoogleCalendarClient = Mock(CalendarClient)
helper.client = mockGoogleCalendarClient
when:
helper.book 'Some Booking Message'
then:
1 * mockGoogleCalendarClient.bookTimeSlot(_)
}
}
推荐阅读
- typescript - 卡在 grafana 中构建面板插件教程
- python - discord.py 我检查是否有人对 wait_for 做出反应
- php - 如何列出我在 Slim Framework 4 中定义到数组中的所有路径?
- python - 我在 tkinter 中使用 messagebox.askokcancel 函数时遇到问题
- c# - 使用反射从方法内部获取“对象”变量字段名称
- javascript - addEventListener 在下拉列表中看不到变化
- node.js - 在我的线性回归模型在 Tensorflow.js 中完成训练后,如何检索系数的值?
- php - Symfony 5.3 - 为什么我的记住我功能不起作用?
- powershell - 使用powershell切换服务运行状态(使用UAC提示)
- django - 跳过 Graphql 查询的 DRF 身份验证