gpt4 book ai didi

unit-testing - Grails Spock 模拟对象

转载 作者:行者123 更新时间:2023-12-02 14:22:47 24 4
gpt4 key购买 nike

我是使用 Spock 在 Grails 应用程序中进行单元测试的新手。不过,我想问以下问题。假设我想为以下函数 testfun 运行测试。

class TestFun{

boolean testfun(long userId, long orderId){

User user = User.findByUserId(userId)
if(user == null)return false
Order order = Order.findByUserAndId(user, orderId)

HashMap<String, Object> = orderContent
orderContent= order.orderContent // the order has an element orderContent for storing the elements that one user orders

if(orderContent!=null){
orderContent.put("meal",1)
order.orderContent = orderContent
return true
}

return false
}
}

在这种情况下,相应的单元测试将是:
class TestFun extends Specification {

def setup() {

GroovySpy(User, global: true)
GroovySpy(Order, global: true)
}
def "test funtest"() {

User user = new User(2).save()
Order order = new Order(3).save()

when:
service.testfun(2,3) == result

then:
2*User.findByUserId(2) >> Mock(User)
1*Order.findByUserAndId(_ as User, 1)>> Mock(Order)
result == true
}
}

但是,我认为我必须模拟 order.orderContent 并且我不知道如何模拟它。现在测试失败了,因为 orderContent 为空,所以 testfun 返回 false。

任何人都可以帮助我吗?

最佳答案

这里发生了几件事,希望修复它们可以帮助您运行和通过测试。

我无法确定,但我相信 GroovySpy是一项旧功能,不用于 Spock 测试。而不是使用它来模拟域类,您应该使用 @Mock类定义之前的注释,以指定要模拟的域类。

虽然您可以模拟域类,但您还需要使用这些对象实际填充内存数据库,或者在 setup: 中。 block ,或在 setup()方法,如果需要它们进行多个测试。

您提到创建模拟,并使用 Spock Mock()方法将创建该对象的模拟,但您不想将其用于域对象。它更通常用于将手动注入(inject)测试类的服务类。

保存模拟域类时,我建议包含参数 flush: true, failOnError: true ,这样任何失败的验证都会立即在相应的行上显示出来。没有这个,你可能会在测试的后期出现一些奇怪的错误。

我不知道你在 when: 中做什么 block ,但您不应该使用 == 进行断言到那时,执行 then: 中的所有操作堵塞。

鉴于所有这些,我认为您的测试类应该看起来更像这样:

@Mock([User, Order])
class TestFun extends Specification {

def setup() {
// This object will have an id of 1, if you want a different id, you can either specify it, or create more objects
User user = new User(first: "john", last: "doe").save(flush: true, failOnError: true)
new Order(user: user).save(flush: true, failOnError: true)
}

def "test funtest"() {

User user = new User(2).save()
Order order = new Order(3).save()

when:
boolean result = service.testfun(1, 1)

then:
// Optionally you can just use "result" on the next line, as true will be assumed
result == true
}
}

关于unit-testing - Grails Spock 模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com