#testing #groovy #mocking #spock #stubbing
#тестирование #groovy #издевательство #spock #отключение
Вопрос:
По какой-то причине (я не очень хорошо разбираюсь в Spock и новичок в mocking amp; stubbing) Я не могу заставить конкретный метод заглушить то, что я хочу.
Я немного сократил, но в основном у меня есть список книг, возвращенных из поиска. В каждой книге есть workId
. Могут быть более старые или новые издания книги, но все они одинаковы workId
— если пользователь выбирает, он может захватить все эти другие издания.
Предисловие
Класс: Издание
class Edition {
//some strings, ints, and booleans -- information about the edition
}
Класс: EditionResults для получения дополнительных изданий одной работы
class EditionResults {
List<Edition> editionsList
String parentWorkId
}
И один последний класс: BulkEditions для упаковки нескольких работ (10 книг на странице результатов поиска)
class BulkEditions {
List<EditionResults> bulkEditions
}
У меня проблемы с этим контроллером
@RequestMapping('/api')
class EditionsController {
@Autowired
private EditionsService editionsService
private Logger logger = LoggerFactory.getLogger(EditionsController)
@RequestMapping(value = '/bulkeditions', produces = 'application/json')
ResponseEntity<BulkEditions> getBulkEditions(
@RequestParam(value = 'workIds') Set<String> workIds
) throws Exception
{
BulkEditions newBulkEditions = new BulkEditions(bulkEditions: [])
workIds.each { workId ->
EditionResults editions = editionsService.searchEditions(workId)
logger.info "EditionResults {}", editions
if (editions?.editionsList) {
newBulkEditions.bulkEditions << editions
}
}
new ResponseEntity<BulkEditions>(newBulkEditions, HttpStatus.OK)
}
}
в частности, у меня возникли проблемы с тестированием истинной ветви editions?.editionsList
— по какой-то причине я продолжаю получать null
для editions
Вот как выглядит мой тест (он всегда проходит, но покрытие clover не выполняется)
class EditionsControllerSpec extends Specification {
private final EditionsService editionsService = Mock(EditionsService)
private static final Set<String> WORK_ID_SET = '12345' as Set<String>
private static final String SINGULAR_WORK_ID = '12345'
@Subject
private final EditionsController controller = new EditionsController(editionsService: editionsService)
void 'test get bulk editions'() {
given:
EditionResults editionResults = Mock(EditionResults)
Edition edition = GroovyMock(Edition) //it's a java class
edition.isAvailable >> true
//edition.bunchOfOtherProps >> randomValues
editionResults.editionsList >> [edition]
editionResults.parentWorkId >> SINGULAR_WORK_ID
editionsService.searchEditions(SINGULAR_WORK_ID) >> editionResults
when:
ResponseEntity<BulkLocalEditions> response = controller.getBulkEditions(WORK_ID_SET)
then:
response
}
Моя проблема в этой части:
editionsService.searchEditions(SINGULAR_WORK_ID) >> editionResults
Я не понимаю, почему я продолжаю получать это обратно (из моего регистратора)
[Test worker] INFO [EditionsController:100] [doCall] EditionResults ***null***
Насколько я понимаю, editionsService.searchEditions(SINGULAR_WORK_ID) >> editionResults
это эквивалентно высказыванию «Когда мы нажмем на этот searchEditions
метод, сделайте его результат editionResults
«, который мы уже заполнили …. так как это null?
Я старался быть максимально подробным и понятным в вопросе, упрощая для краткости, но, пожалуйста, дайте мне знать, если потребуется какая-либо дополнительная информация — и, конечно, заранее спасибо.
Также стоит отметить, что он действительно работает на моем локальном компьютере, и все возвращается правильно — это просто покрытие clover, которое меня привлекает
Комментарии:
1. А если вы переместите эту строку в
then:
блок?2. @tim_yates ну, я чувствую себя идиотом 🙂 большое вам спасибо!
3. Не делайте этого, это ловит всех, по крайней мере, дважды 😁
4. Вы или @tim_yates хотите «ответить» на это, чтобы оно не было помечено как неотвеченное и делало его более понятным для кого-то с подобной проблемой? 🙂
Ответ №1:
Благодаря @tim_yates
editionsService.searchEditions(SINGULAR_WORK_ID) >> editionResults
должно было быть в моем then
блоке