【问题标题】:Spock Testing and mocking or stubing database interactionSpock 测试和模拟或存根数据库交互
【发布时间】:2016-09-13 16:37:17
【问题描述】:

我有一个私有控制器方法,多个操作使用该方法从数据库中检索对象。我无法终生正确地模拟/存根对数据库的调用。控制器方法是:

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 的新手。而且由于我们正在为遗留代码编写测试,这更加令人困惑。

【问题讨论】:

  • 我不确定您的问题到底是什么。如果您正在寻找 Mocking 和 Stubbing 的解释,那么 Spock 文档是一个很好的起点。检查spockframework.org/spock/docs/1.1-rc-2/…
  • 我的问题是我想看到,当我调用 MyDomain.get() 时,它会从数据库返回一个 MyDomain 对象以呈现我的视图或执行操作。当我以不同的方式运行测试时,我尝试模拟或存根该功能/交互,我得到一个空值,因此我无法让我的测试通过。我需要知道模拟或存根这种交互的正确方法,因为 Spock 文档和/或教程似乎没有解决这种类型的交互

标签: unit-testing grails-orm grails-2.0 spock


【解决方案1】:

你可以简单地在你的测试类声明之上使用@Mock([Order])

【讨论】:

  • @Mock([Order, SpringSecurityService, User]) 已经是我声明的一部分。我也在使用@TestMixin(GroovyPageTestMixin)
  • 在您调用控制器获取该域之前,我看不到在您的测试用例中创建和保存的域对象。 @Mock 只会模拟该类上的方法,但不会实际创建对象。在你给定的:block try def order = new Order(3002); order.save() 在你调用 controller.getSalesOrder() 之前
  • 在 setup() 中,我创建了一个订单数组。你会在测试用例中看到 salesOrders[2]
  • 删除行 Order.metaClass.static.get() >> testOrder 并添加 testOrder.save()
【解决方案2】:

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

您要么必须模拟此方法,并在其中使用计数器来进行计数检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多