gpt4 book ai didi

grails - Grails 中的模拟私有(private)方法

转载 作者:行者123 更新时间:2023-12-02 16:02:08 25 4
gpt4 key购买 nike

我是 grails 的新手,在集成测试方面遇到困难。我有一个服务类,它在内部从私有(private)方法调用外部服务。有什么方法可以模拟这个私有(private)方法,这样我就可以避免集成测试的外部服务调用?请指导我。

下面的示例代码:

import org.springframework.web.client.RestTemplate;

public class Service {
final static RestTemplate REST = new RestTemplate()

def get() {
def list = REST.getForObject(url, clazzObject, map)
list
}
}

集成测试类
class RackServiceIntegrationSpec extends IntegrationSpec {
def service = new Service()

void testApp(){
setup:
def testValues = ["name1", "name2"]
service.metaClass.get = {String url, Class clazz, Map map -> testValues}

when:
def val = service.get()

then:
val.get(0) == 'name1'

}
}

它不是模拟 rest 调用,而是实际进行原始的 rest 调用并从数据库中获取值。我在这里做错什么了吗?

最佳答案

正如@Opal 已经评论的那样 - 而不是模拟服务的内部细节(如私有(private)方法),您应该切断外部依赖关系。但这当然只适用于单元测试类型的测试。根据您的测试目标,您可以切断外部内容或进行实际调用并在另一侧使用模拟(两者都是不同级别的两个有效测试)。

当您想在进行电汇之前进行模拟时,您应该使用 RestTemplate 的模拟实例来执行此操作(这意味着您必须让它可注入(inject) - 无论如何这是一个好主意,因为它是一个外部依赖项)。但是spring提供了一个更好的解决方案:MockRestServiceServer

class RackServiceIntegrationSpec extends IntegrationSpec {
def service = new Service()
def 'service calls the external http resource correct and returns the value'() {
setup: 'create expectations on the http interactions'
MockRestServiceServer mockServer = MockRestServiceServer.createServer(service.REST)
mockServer.expect(requestTo("/customers/123")).andRespond(withSuccess("Hello world", MediaType.TEXT_PLAIN));

when: 'service gets called'
def val = service.get()

then: 'http interactions were successful given the assertions above'
mockServer.verify();

and: 'your other assertions'
val.get(0) == 'name1'

}
}

如需更多信息,请参阅 spring testing documentation

关于grails - Grails 中的模拟私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29505714/

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