gpt4 book ai didi

spring - 如何在 Controller 单元测试中模拟Grails 4服务

转载 作者:行者123 更新时间:2023-12-02 13:50:21 24 4
gpt4 key购买 nike

我不了解在Grails 4.0中模拟是如何工作的。
我有一个失败的单元测试(这只是真实测试的一个说明,真实测试实际上涉及 Controller ):

import com.myapp.MySearchService

class ApiControllerSpec extends Specification implements ControllerUnitTest<ApiController> {

def setup() {
}

def cleanup() {
}

void "test listSources"() {
given:
def mock = Mock(MySearchService) {
find(_) >> [["label": "abc", "description": "xsad"]]
}

when:
System.out.println(mock.find(''))

then:
1 * mock.find(_) >> [["label": "abc", "description": "xsad"]]
}


有错误
Too few invocations for:

1 * mock.find(_) >> [["label": "abc", "description": "xsad"]] (0 invocations)

Unmatched invocations (ordered by similarity):

1 * mock.invokeMethod('find', [<java.lang.String@0 value= hash=0>])


at org.spockframework.mock.runtime.InteractionScope.verifyInteractions(InteractionScope.java:93)
at org.spockframework.mock.runtime.MockController.leaveScope(MockController.java:77)
at toe.ApiControllerSpec.test listSources(ApiControllerSpec.groovy:29)

和标准输出
null

有趣的是,如果我使用非常简单的测试类而不是MySearchService,则此方法很好用。因此,我假设它必须与Grails / Spring的设置方式有关。这也可以解释以下几行:
Unmatched invocations (ordered by similarity):

1 * mock.invokeMethod('find', [<java.lang.String@0 value= hash=0>])

但是我如何设置它呢?我在文档的任何地方都找不到。谢谢你的帮助!

类似问题(无答案):
How to partially mock service in Grails integration test

最佳答案

模拟的语法不正确-这是在Grails 4.0.1中测试的工作示例

    void "test something"() {
given:
def mock = Mock(SearchService) {
1 * find(_) >> ['foobar'] // note the interaction count is required when defining this way.
}

when:
def result = mock.find('')

then:
result == ['foobar']
}

参见- http://spockframework.org/spock/docs/1.0/interaction_based_testing.html-部分: Declaring Interactions at Mock Creation Time
请注意,Grails文档中可能没有此功能,因为没有任何Grails特定于此-仅Spock。

关于spring - 如何在 Controller 单元测试中模拟Grails 4服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59030447/

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