当前位置: 首页 > 知识库问答 >
问题:

如何模拟REST请求

蒋乐意
2023-03-14

我在JUnit中使用Mockito,并且我有一个使用RestTemboard向微服务发出请求的方法。

private static final String REQUESTOR_API_HOST = "http://localhost:8090/requestor/v1/requestors/";

public TokenRequestorPayload getTokenRequestor(Long id) {
    restClient = new RestTemplate();
    return restClient.getForObject(REQUESTOR_API_HOST + id, TokenRequestorPayload.class);
}

此方法返回一个JSON对象,该对象将在TokenRequestorPayload类中反序列化。

当我执行单元测试时,它们会失败,因为mock不起作用,我得到了一个org.springframework.web.client.ResourceAccessExcure。我怎么能嘲笑我的RestTem板?

测试

RestTemplate restTemplate = Mockito.spy(RestTemplate.class);
Mockito.doReturn(this.tokenRequestorMockJson()).when(restTemplate).getForObject(Mockito.anyString(), Mockito.eq(TokenRequestorPayload.class));

错误

org.springframework.web.client.ResourceAccessExcture:在GET请求http://localhost:8090/requestor/v1/requestors/1时出现I/O错误:连接拒绝(连接拒绝);嵌套异常java.net.ConnectExcture:连接拒绝(连接拒绝)

共有2个答案

巫马泰
2023-03-14

使用Spring对RestTem板的嘲弄支持,而不是试图嘲弄RestTem板——好得多:

创建将其绑定到RestTemplate的模拟rest服务服务器:

MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

记录对该模拟服务器的调用,例如。

  mockServer.expect(requestTo("some url").andExpect(method(HttpMethod.POST))
                .andRespond(withSuccess("addSuccessResult", MediaType.TEXT_PLAIN));

然后验证模拟已被调用:

mockServer.verify();

看见https://objectpartners.com/2013/01/09/rest-client-testing-with-mockrestserviceserver/

裘安阳
2023-03-14

在测试中,您正在为RestTemplate的模拟实例定义行为,这很好。

RestTemplate restTemplate = Mockito.spy(RestTemplate.class);

但是,被测试的类不使用同一实例,该类每次创建一个新的RestTemplate实例并使用该实例。

public TokenRequestorPayload getTokenRequestor(Long id, RestTemplate restClient) {
    restClient = new RestTemplate(); // it uses this instance, not the mock
    return restClient.getForObject(REQUESTOR_API_HOST + id, TokenRequestorPayload.class);
}

因此,您需要找到一种方法将模拟实例引入getTokenRequestor()方法。

例如,这可以通过将restClient转换为方法参数来实现:

public TokenRequestorPayload getTokenRequestor(Long id, RestTemplate restClient) {
    return restClient.getForObject(REQUESTOR_API_HOST + id, TokenRequestorPayload.class);
}

测试可能看起来像:

@Test
public void test() {
    RestTemplate restTemplateMock = Mockito.spy(RestTemplate.class);
    Mockito.doReturn(null).when(restTemplateMock).getForObject(Mockito.anyString(), Mockito.eq(TokenRequestorPayload.class));

    // more code

    instance.getTokenRequestor(id, restTemplateMock); // passing in the mock
}
 类似资料:
  • 我有一项服务,我需要通过rest向外部服务器询问一些信息: 如何为getListofObjectsA()编写JUnit测试? 我尝试了以下方法: 然而,上面的代码不起作用,它表明为。如何更正测试以正确模拟restTemplate。交换?

  • 我尝试使用在集成测试套件中测试。 ()调用注入的(),后者使用调用另一个REST服务器。这导致运行测试时出现以下错误。 resourceAccessException:获取“http://test123.com/42/status”的请求时出现I/O错误:test123.com;嵌套异常为java.net.UnknownHostException:test123.com 我使用对本身进行集成测试,

  • 在我的views.py中,我有一个函数,它每次使用不同的响应来调用各种requests.get() 在我的测试类中,我想做这样的事情,但无法计算出确切的方法调用 步骤1: 验证响应包含“a response”、“b response”、“c response” 如何完成步骤1(模拟请求模块)?

  • 似乎有很多不同的方法可以做到这一点,但我试图只使用sinon,sinon-test,chai/mocha,axios,httpmock模块。我无法成功模拟使用axios进行的GET调用。我希望能够模拟来自axios调用的响应,这样单元测试实际上就不必发出外部API请求。 我尝试过通过创建沙箱来建立一个基本的单元测试,并使用sinon stub来建立一个GET调用并指定预期的响应。我不熟悉JavaS

  • 我需要对一个方法进行unittest,该方法有2个rest调用和另一个方法调用。详细描述如下: 现在,对于methB和methC方法,我用这里给出的解决方案模拟了rest调用。但是使用methA()我无法为两种不同类型(GET和POST)的两个不同REST调用修补mock。模拟此场景的可能解决方案是什么?提前通知。

  • 我正在编写一些单元测试代码,我想模拟在我的函数中使用的模块: