gpt4 book ai didi

grails - 使用 Spock stub Grails 域类中的 Gorm 和其他方法

转载 作者:行者123 更新时间:2023-12-04 07:39:57 24 4
gpt4 key购买 nike

抱歉,如果这是一个新手问题,但我非常感谢社区可以就我在使用 Grails 服务 LocationService 中的以下方法 stub 时遇到的问题提供任何见解。

Location locate(String target, String locator, Application app, boolean sync = true) {
if (!target) throw new IllegalArgumentException("Illegal value for msid: " + target)
def locRequest = Request.create(target, Type.LOCATE)
if (!locRequest.save()) {
return Location.error(target, "Error persisting location request")
}
locationSource.locateTarget(target, locator, app, sync)
}

我有一个域类 Request,除了默认的 GORM 方法外,还有一些额外的域方法,例如。下面的 create() 方法
@EqualsAndHashCode
class Request {

String reference
String msid
Type type
Status status
Destination destination
DateTime dateCreated
DateTime dateCompleted

static create(String msid, Type type, Destination destination = Destination.DEFAULT) {
new Request(reference: reference(type), type: type, status: Status.INITIATED, dateCreated: new DateTime())
}

最后,我有一个 Spock 规范。我需要模拟默认的 GORM 方法,还需要模拟一些额外的域逻辑,例如静态创建方法,以便返回一个有效的对象,以便在被测代码中持久化。

理想情况下,我会使用 Spock 模拟,但我不能在这里使用它们,因为根据下面 Peter N 的帖子,它们需要被注入(inject)到调用者中,在这种情况下,创建请求(我试图模拟)作为 LocationService 中的 locate 方法中的局部变量:

https://groups.google.com/forum/?fromgroups=#!topic/spockframework/JemiKvUiBdo

我也不能使用 Grails 2.x @Mock 注释,虽然这会模拟 GORM 方法,但我不确定我是否可以模拟/ stub 来自 Request 类的附加静态 create() 方法。

因此,最后,我一直在尝试使用 Groovy StubFor/MockFor 方法来执行此操作,因为我相信这些将通过将测试方法包装在 use 闭包中来用于调用测试方法(如下所示)。

这是测试规范:
@TestFor(LocationService)
// @Mock(Request)
class LocationServiceSpec extends Specification {

@Shared app = "TEST_APP"
@Shared target = "123"
@Shared locator = "999"

def locationService = new LocationService()
LocationSource locationSource = Mock()


def "locating a valid target should default to locating a target synchronously"() {
given:
def stub = new StubFor(Request)
stub.demand.create { target, type -> new Request(msid: target, type: type) }
stub.demand.save { true }
1 * locationSource.locateTarget(target, locator, app, SYNC) >> { Location.create(target, point, cellId, lac) }
def location
when:
stub.use {
location = locationService.locate(target, locator, app)
}
then:
location
}

但是,当我运行测试时,虽然 stub 创建方法返回了我的请求 stub 对象,但 stub 保存方法却失败了:
groovy.lang.MissingMethodException: No signature of method:       com.domain.Request.save() is applicable for argument types: () values: []
Possible solutions: save(), save(boolean), save(java.util.Map), wait(), last(), any()

如果需要 stub 其他方法以及我无法直接注入(inject)到被测代码中的域类的 GORM 方法,任何人都可以指出我在这里做错了什么或建议解决我的特定情况的最佳方法吗?

先感谢您,

帕特里克

最佳答案

我相信你应该可以使用 Grails 的 @Mock像您为 GORM 方法提到的注释,然后您将需要手动模拟静态方法:

@TestFor(LocationService)
@Mock(Request)// This will mock the GORM methods, as you suggested
class LocationServiceSpec extends Specification {
...
void setup() {
Request.metaClass.static.create = { String msid, Type type, Destination destination = Destination.DEFAULT ->
//Some logic here
}
}
...

使用 @Mock 时注释,Grails 将模拟默认方法(保存/获取/动态查找器),但它不会对您可能添加的任何其他方法做任何事情,因此您需要手动模拟这些方法。

关于grails - 使用 Spock stub Grails 域类中的 Gorm 和其他方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15544668/

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