首页 > 解决方案 > Groovy spock 测试没有正确存根——接收到 null

问题描述

出于某种原因(我对 Spock 不是很好,并且对模拟和存根不熟悉)我无法获得一种特定的方法来存根我想要的东西。

我把事情缩短了一点,但基本上我有一个搜索返回的书籍列表。每本书都有一个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


这是我的测试的样子(它总是通过,但三叶草覆盖率失败)

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”——我们已经填充了......那么它怎么会为空呢?


我已尝试尽可能详细和干净地处理问题,为简洁起见进行简化,但如果需要任何其他信息,请告诉我 - 当然提前感谢。

还值得注意的是,它实际上适用于我的本地并且一切都恢复正常 - 只是这种三叶草覆盖让我

标签: testinggroovymockingspockstubbing

解决方案


感谢@tim_yates

editionsService.searchEditions(SINGULAR_WORK_ID) >> editionResults应该在我的then街区


推荐阅读