我在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:连接拒绝(连接拒绝)
使用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/
在测试中,您正在为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。模拟此场景的可能解决方案是什么?提前通知。
我正在编写一些单元测试代码,我想模拟在我的函数中使用的模块: