当前位置: 首页 > 知识库问答 >
问题:

Spock:mocked类的方法不匹配

巫马淳
2023-03-14
class VmExportTaskSplitter implements TaskSplitter<Export> {

    @Inject
    AssetServiceClient assetServiceClient

    @Override
    int splitAndSend(Export export) {

        Map batch = [:]
        Map tags = [:]

        if (true) {
            println('test')
            batch = assetServiceClient.getAssetIdBatch(export.containerUuid,
                    export.userUuid, (String) batch.scrollId, tags)
            print('batch: ')
            println(batch)
        }

        return 1

    }
}
class VmExportTaskSplitterSpecification extends Specification{
    def "tags should be parsed correctly"(){
        setup:
        Export export = new Export(containerUuid: "000", userUuid: "000", chunkSize: 10)
        FilterSet filterSet = new FilterSet()
        filterSet.tag = [:]
        filterSet.tag['tag.Location'] = 'Boston'
        filterSet.tag['tag.Color'] = 'red'
        Map<String, String> expectedTags = ['tag.Location':'Boston', 'tag.Color':'red']
        ObjectMapper mapper = new ObjectMapper()
        export.filters = mapper.writeValueAsString(filterSet)

        def assetServiceClient = Mock(AssetServiceClientImpl) {
            Map map1 = [assetIds:["1","2","3","4","5"],scrollId:null]
            getAssetIdBatch(_ as String,_ as String, null, _ as Map) >> map1
            getAssetIdBatch('000', '000', null, ['tag.Location':'Boston', 'tag.Color':'red']) >> map1
            getAssetIdBatch(_, _, _, _) >> map1
        }

        VmExportTaskSplitter splitter = new VmExportTaskSplitter()
        splitter.assetServiceClient = assetServiceClient

        when:
        splitter.splitAndSend(export)

        then:
        1 * assetServiceClient.getAssetIdBatch(_ as String, _ as String, _, _ as Map)
    }
}

当运行此操作时,可以看到批处理仍被打印为null。我在设置交互时做错了什么?

Using logging directory: './logs'
Using log file prefix: ''
test
batch: null

共有1个答案

景高杰
2023-03-14

你--像以前的许多人一样--遇到了斯波克的一个巨大难题:嘲笑和讽刺的结合,以及它必须发生在一条线上的事实。形成文档:

对相同方法调用的模仿和存根必须在相同的交互中发生。

给定块中插入AssetServiceClient.getAssetidBatch以返回MAP1,然后在then块中验证模拟调用。后者隐式地指示模拟返回null而不是map1。思考

1 * assetServiceClient.getAssetIdBatch(_ as String, _ as String, _, _ as Map) // >> null
1 * assetServiceClient.getAssetIdBatch(_ as String, _ as String, _, _ as Map) >> map1

并在方法的作用域中定义map1,它将按预期工作。

您可能还希望从givid块中删除重复项。

不要担心它在then块中。在您输入when块之前,Spock会执行所有的模仿和stubbing。如果您想查看代码,请逐级查看。

 类似资料:
  • 我正在用JUnit5测试一个应用程序,并使用Jacoco进行报道。测试执行正常,并有测试报告。 但是,如果服务包含方法,则Jacoco report会有以下日志,并用@Transactional注释 所有@Service class方法都会发生此错误,并用@Transactional注释,普通类coverage is calculated ok。 下面是一个样本测试: 很好。覆盖率为非零: 0%覆

  • 我试图通过对通过其JNDI引用查找的EJB的反射来调用一个方法。它需要三个参数:EndUser对象(自定义对象)、Set(自定义类)和布尔值。第一个对象使用“无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配”导致调用失败。只要第一个参数非空,就会发生这种情况。将其设置为空会使错误消失。 实际通话: EjbUtils方法: 我尝试调用的方法: 奇怪的

  • 我试图使用一种方法来反转字符串中的字符,但我不断遇到类型不匹配错误。有什么想法吗?

  • 这是我的错误行: 这是我的代码:

  • 问题内容: 我正在使用/ 来获取HTTP响应中的响应代码。返回1,但是尝试获取异常!知道为什么吗? 这是代码: 这是输出: 问题答案: 总是会创建一个新的匹配器,因此您需要再次致电。 尝试:

  • 我在这里复制代码;https://developer.android.com/codelabs/kotlin-android-training-view-model#5 但我从DataBindingUtil中得到了一个类型不匹配。充气方法。正在返回ViewDataBinding!,当需要FragmentPlayBinding时。 我https://github.com/google-develop