Я пытаюсь написать некоторый тест, где, но кажется, что данные, упомянутые в блоке, не передаются (я обнаружил, что значения равны нулю). Вот мой модульный тест:
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
. Пожалуйста, помогите здесь.
Попробуйте переместить заглушку (mockConnector.getResponse(userId) >> responseData
) и другие настройки (service.setTokenConnector(mockConnector)
) в блок given
. Обычно заглушка в блоке when не видна.
«tokenInfos
инициализируется ранее как массив объектов с некоторыми значениями» — как инициализировался? Какие ценности? Что неожиданно оказалось нулевым во время теста? Это что-то вроде игрового шоу, в котором вы прячете то, о чем спрашиваете, чтобы кандидатам было труднее ответить правильно? Пожалуйста, узнайте как задать вопрос на SO и предоставьте минимальный, полный и проверяемый пример. Спасибо.
@ShingJo Я уже пробовал это раньше, но это не помогло
@kriegaex я добавил инициализацию
@suvodipMondal, спасибо за это. Вы оказали себе большую услугу, следуя моему совету, потому что это позволило Леонарду ответить на ваш вопрос, хотя на самом деле это не было MCVE даже после вашего редактирования. Видите, в этом прелесть этого сообщества: вы не зависите ни от одного человека. Вчера я больше не заходил сюда, а тем временем другой участник сообщества вмешался и ответил на ваш вопрос. 😊
Я попытаюсь ответить, но, как указал @krigaex, без минимального, полного и поддающегося проверке примера трудно быть уверенным.
Есть несколько вещей, которые неверны или не имеют никакого эффекта.
@AutoCleanup
вызовет метод close()
для объекта поля. Здесь поле представляет собой массив, в котором нет метода close()
.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
работает
пожалуйста, добавьте полный исходный код для этого тестового класса. иначе трудно сказать, что может быть не так