我有以下控制器代码:
@Transactional
def save(MyModel model) {
model.save()
}
我正在使用以下方式对其进行测试:
request.json = new MyModel(property1: 1, property2: 2)
controller.save()
但是,每次运行测试时,我都会得到NullPointerException
,因为model
为空。我是否需要放置任何其他代码才能使绑定正常工作?
答案 0 :(得分:7)
如果在控制器单元规范/测试中适当地模拟域对象,则将域对象设置为request.json
应该有效。
相反,您还可以在测试中将JSON字符串设置为request.json
,然后在调用控制器操作时绑定到MyModel
。所以你的测试应该是这样的:
request.json = '{"property1": 1, "property2": 2}'
另请注意,由于请求有效负载中没有id
,这表示您尝试POST新记录。在这种情况下,只有在请求中将http方法明确设置为POST
时,与域对象的数据绑定才会起作用。
request.method = 'POST'
答案 1 :(得分:4)
为了让测试代码正常工作,我拨打了controller.request.json
而不是request.json
。另外,根据dmahapatro's answer,我将方法设置为POST
。
以下是工作代码的外观:
controller.request.method = 'POST'
controller.request.json = new MyModel(property1: 1, property2: 2)
controller.save()
虽然控制器方法save
不再获取空对象,但未设置JSON数据应设置的属性。
在启动一个不同的项目并完成同样的事情之后,所有事情甚至都能将绑定属性绑定到方法参数。