Спок: метод издевательского класса не сопоставляется - PullRequest
0 голосов
/ 12 ноября 2018

Мне удалось пройти проходной тест для неактивной версии моего кода (благодаря cgrim! Спок: метод не распознается как вызов ), но с реальным кодом он не будет работать если getAssetIdBatch не возвращает что-то, что не является нулевым. Я не могу понять, почему мои взаимодействия не реализуются. Ниже вы можете увидеть три попытки заставить getAssetIdBatch вернуть образец map1.

Вот глупая версия кода:

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 Ответ

0 голосов
/ 13 ноября 2018

Вы - как и многие другие - столкнулись с одной гигантской особенностью Спока: комбинация Насмешек и Стаббинга и тот факт, что это должно происходить в одну строку. Форма документов:

В одном и том же взаимодействии должна происходить насмешка и заглушка одного вызова метода.

Вы нажали assetServiceClient.getAssetIdBatch, чтобы вернуть map1 в своем блоке given, а затем подтвердили ложный вызов в своем блоке then. Последний неявно указывает макету возвращать null вместо map1. Подумайте

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

Измените эту строку на

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

и определите map1 в области действия метода, и он будет работать как положено.

Возможно, вы также хотите удалить дубликат из блока given.

Не беспокойтесь об этом в блоке then. Спок выполняет все насмешки перед тем, как войти в блок when. Пройдите по коду, если хотите его увидеть.

...