Java - Spock“where”块不工作

relj7zay  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(106)

我尝试用where写一些测试,但是看起来where块中提到的数据没有被传递,(我发现值为null)。

def "method response should contain count as expected" () {
        given:
        SomeServiceImpl service = applicationContext.getBean(SomeServiceImpl.class)

        when:
        mockConnector.getResponse(userId) >> responseData
        service.setTokenConnector(mockConnector)
        ResponseData res = tokenService.getAllData(userId)
        def count = ((ListResponseMeta)(res.getMeta())).getCount()

        then:
        count == expected

        where:
        responseData | expected
        tokenInfos | 1
        null | 0
    }

tokenInfos之前被初始化为具有一些值的对象数组。

@Shared
    @AutoCleanup
    Info[] tokenInfos = null

    def setup() {
        tokenInfos = getMockInfoBody()
        mockTokenConnector = Mock(SampleConnector.class)
    }

    private static Info[] getMockInfoBody() {
        Info infoDeactivated = new Info("123", "http://abc.xyz.com", "D")
        Info infoActive = new Info("234", "http://abc.xyz.com", "A")
        Info infoSuspended = new Info("235", "http://abc.xyz.com", "S")

        Info[] tokenInfos = new Info[3]
        tokenInfos[0] = infoDeactivated
        tokenInfos[1] = infoActive
        tokenInfos[2] = infoSuspended

        return tokenInfos
    }

我尝试在when块中移动responseData,以前responseData正在given块中使用。请在此处提供帮助。

0s7z1bwu

0s7z1bwu1#

我会试着回答,但正如@krigaex指出的,没有minimal, complete, and verifiable example很难确定。
有很多事情是错误的或没有效果的。

  1. @AutoCleanup将调用字段对象上的close()方法,这里的字段是一个数组,没有close()方法。
    1.你声明tokenInfos@Shared,但是你只在第一次setup()调用时初始化它,这对于where块的第一个条目来说太晚了,所以,要么直接初始化字段,要么把赋值移到setupSpec
@Shared
    Info[] tokenInfos = getMockInfoBody()
    // OR
    def setupSpec() {
        tokenInfos = getMockInfoBody()
    }

目前,你的were方法基本上是这样的

where:
        responseData | expected
        null         | 1        // tokenInfos is still null as setup() didn't run yet
        null         | 0

相关问题