首页 > 解决方案 > 在 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在问价值应该是什么。

为什么测试首先会出现这个问题?

标签: groovyspock

解决方案


https://github.com/jeffbrown/toronaga07spock是一个工作示例。

构建.gradle

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(_)
    }
}

推荐阅读