Java - Spock "где" блок не работает

Я пытаюсь написать некоторый тест, где, но кажется, что данные, упомянутые в блоке, не передаются (я обнаружил, что значения равны нулю). Вот мой модульный тест:

    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
    }

Я пытался переместить responseData в блоке when, ранее responseData использовался в блоке given. Пожалуйста, помогите здесь.

пожалуйста, добавьте полный исходный код для этого тестового класса. иначе трудно сказать, что может быть не так

saw303 22.12.2022 16:07

Попробуйте переместить заглушку (mockConnector.getResponse(userId) >> responseData) и другие настройки (service.setTokenConnector(mockConnector)) в блок given. Обычно заглушка в блоке when не видна.

ShingJo 22.12.2022 16:26

«tokenInfos инициализируется ранее как массив объектов с некоторыми значениями» — как инициализировался? Какие ценности? Что неожиданно оказалось нулевым во время теста? Это что-то вроде игрового шоу, в котором вы прячете то, о чем спрашиваете, чтобы кандидатам было труднее ответить правильно? Пожалуйста, узнайте как задать вопрос на SO и предоставьте минимальный, полный и проверяемый пример. Спасибо.

kriegaex 22.12.2022 18:02

@ShingJo Я уже пробовал это раньше, но это не помогло

suvodipMondal 22.12.2022 18:40

@kriegaex я добавил инициализацию

suvodipMondal 22.12.2022 18:42

@suvodipMondal, спасибо за это. Вы оказали себе большую услугу, следуя моему совету, потому что это позволило Леонарду ответить на ваш вопрос, хотя на самом деле это не было MCVE даже после вашего редактирования. Видите, в этом прелесть этого сообщества: вы не зависите ни от одного человека. Вчера я больше не заходил сюда, а тем временем другой участник сообщества вмешался и ответил на ваш вопрос. 😊

kriegaex 23.12.2022 08:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытаюсь ответить, но, как указал @krigaex, без минимального, полного и поддающегося проверке примера трудно быть уверенным.

Есть несколько вещей, которые неверны или не имеют никакого эффекта.

  1. @AutoCleanup вызовет метод close() для объекта поля. Здесь поле представляет собой массив, в котором нет метода close().
  2. Вы объявляете tokenInfos как @Shared, но инициализируете его только при первом вызове setup(), что произойдет слишком поздно для первой записи в блоке where. Итак, либо инициализируйте поле напрямую, либо переместите присваивание в setupSpec.
    @Shared
    Info[] tokenInfos = getMockInfoBody()
    // OR
    def setupSpec() {
        tokenInfos = getMockInfoBody()
    }

В настоящее время ваш метод в основном выглядит так


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

Понятно, инициализация в методе setupSpec работает

suvodipMondal 23.12.2022 07:40

Другие вопросы по теме