testing - 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
”——我们已经填充了......那么它怎么会为空呢?
我已尝试尽可能详细和干净地处理问题,为简洁起见进行简化,但如果需要任何其他信息,请告诉我 - 当然提前感谢。
还值得注意的是,它实际上适用于我的本地并且一切都恢复正常 - 只是这种三叶草覆盖让我
解决方案
感谢@tim_yates
editionsService.searchEditions(SINGULAR_WORK_ID) >> editionResults
应该在我的then
街区
推荐阅读
- excel - VBA 表格范围 - 函数不包括表格的最后一行
- django-forms - 在 Django Signals 中使用额外的表单字段
- tensorflow - 如何在 keras 网络中手动设置参数,比 model.set_weight() 更有效?
- python - 当单击带有 pysimpleGUI 的按钮并在多行中显示输出时,如何解决卡住的问题?
- android - 如何在 Kotlin 中将 List 转换为 ArrayList
- javascript - 达到容量时,IndexedDB 拒绝删除存储
- nginx - NGINX Slug 目录重写
- java - 如何将字节转换为更有用的数据?
- javascript - 如何通过 React 中的预签名 S3 URL 预览图像?
- dictionary - Kotlin 地图类型推断失败