Spock测试和模拟或存根数据库交互

时间:2016-09-13 16:37:17

标签: unit-testing gorm grails-2.0 spock

我有一个私有控制器方法,多个操作使用它来从数据库中检索对象。我不能为我的生活正确地模拟/存根对数据库的调用。 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。由于我们正在为遗留代码编写测试,因此更加令人困惑。

2 个答案:

答案 0 :(得分:0)

您可以在测试类声明

之上使用@Mock([Order])

答案 1 :(得分:0)

我认为你调用太少的失败案例是正确的。我不认为你可以查看1 * Order.get(3002)。此调用将始终返回0次调用,您将检查1。

你要么必须使用计数器来模拟这个方法来进行计数检查。