Спок: метод мошеннического класса не соответствует

62
5

Мне удалось пройти проходной тест для тупой версии моего кода (благодаря cgrim! Spock: метод не распознан как вызов), но с реальным кодом он не будет работать, если 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

спросил(а) 2018-11-12T21:09:00+03:00 2 года, 5 месяцев назад
1
Решение
76

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

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

Вы 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. Пройдите по коду, если хотите его увидеть.

ответил(а) 2018-11-13T16:18:00+03:00 2 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема