Тест Groovy spock не работает правильно — получение null

#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 блоке