我有一个私有控制器方法,多个操作使用它来从数据库中检索对象。我不能为我的生活正确地模拟/存根对数据库的调用。 Controller方法是:
private Order getSalesOrder(){
def order = Order.get(params.id)
if(!order){
flash.message = (code: 'default.not.found.message', args: [message(code: 'order.label', default: 'Order'), params.id])
redirect action: "list"
return
}
return order
}
此时的测试方法是:
def "test getSalesOrder returns Sales Order"(){
given:
params.id >> 3002L
criteriaSetup()
Order testOrder = salesOrders[2]
Order.metaClass.static.get() >> testOrder
when:
def order = controller.getSalesOrder()
then:
1 * Order.get(3002) >> testOrder
//1 * Order.get() >> salesOrders[2]
order == testOrder
}
我的结果要么是一个关于调用太少的消息,要么我只是得到一个空值。两者都会导致测试失败。
我通过使用各种博客或教程中的示例尝试了各种变体,例如:
Order.metaClass.static.get() >> testOrder
Order.metaClass.methods.get = { return testOrder }
1 * Order.get(3002) >> testOrder
1 * Order.get(params.id) >> testOrder
我不知道从哪里开始,因为我是一个新的spock测试,Mocking和Stubing。由于我们正在为遗留代码编写测试,因此更加令人困惑。
答案 0 :(得分:0)
您可以在测试类声明
之上使用@Mock([Order])答案 1 :(得分:0)
我认为你调用太少的失败案例是正确的。我不认为你可以查看1 * Order.get(3002)
。此调用将始终返回0次调用,您将检查1。
你要么必须使用计数器来模拟这个方法来进行计数检查。