gpt4 book ai didi

java - 资源访问异常 : I/O error on POST request

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

我有一个服务方法。该方法是通过POST请求访问第三方资源。我正在编写测试,我在日志中看到错误。服务:

@Override
public void sendDoc(String id) throws IOException {
byte[] zipData = getZipFromIntegration(mongo.getDocument());

String response;
HttpStatus httpStatus;
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("file", new MultipartInputStreamFileResource(new ByteArrayInputStream(zipData),
String.format("%s_some.zip", id)));

HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(3000);
clientHttpRequestFactory.setReadTimeout(3000);
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

response = restTemplate.postForObject(uploadUrl + system,
requestEntity, String.class);

} catch (HttpStatusCodeException e) {
LOG.error("Some error");
}
}

我的测试

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE, classes = {SendServiceImpl.class})
@EnableAutoConfiguration
@PropertySource(value = "classpath:application.properties", encoding = "UTF-8")
public class SendServiceImplTest {
@MockBean
private RestTemplate restTemplate;
@Autowired
private SendServiceImpl service;

@Test
public void sendDoc() throws IOException {
when(restTemplate.postForObject(
anyString(),
ArgumentMatchers.<HttpEntity<?>>any(),
ArgumentMatchers.<Class<String>>any()
))
.thenReturn("ok");

service.sendDoc("55454545uid");
}
}

但我看到有对真实服务器的调用。测试成功,但在日志中我看到错误:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://some-url.digital.cloud.ru/v1/doc/reg"

UPD:像这样更改测试:

@RunWith(PowerMockRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = SendServiceImpl.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PrepareForTest({SendServiceImpl.class, RestTemplate.class})
@PowerMockIgnore({"javax.xml.*", "org.xml.sax.*", "org.w3c.dom.*"})
public class SendServiceImplTest {
@MockBean
private RestTemplate restTemplateMock;

@Autowired
private SendServiceImpl service;

@Test
public void sendDoc() throws IOException {
RestTemplate restTemplate = PowerMockito.mock(RestTemplate.class);
whenNew(RestTemplate.class).withArguments(ClientHttpRequestFactory.class).thenReturn(restTemplate);
when(restTemplate.postForObject(
anyString(),
ArgumentMatchers.<HttpEntity<?>>any(),
ArgumentMatchers.<Class<String>>any()
))
.thenReturn("ok");

service.sendDoc("55454545uid");
}
}

现在该对象被 null 替换。即服务中的restTemplate为null。

最佳答案

我的问题的解决方案如下所示:

@RunWith(PowerMockRunner.class)
@SpringBootTest(webEnvironment = NONE, classes = SendServiceImpl.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PrepareForTest({
SendServiceImpl.class,
RestTemplate.class,
HttpComponentsClientHttpRequestFactory.class
})
@MockBean({FileStorageService.class, DocxToPdfConverterService.class})
@PowerMockIgnore({"javax.xml.*", "org.xml.sax.*", "org.w3c.dom.*"})
public class SendServiceImplTest {
@Test
public void sendDoc() throws Exception {
RestTemplate restTemplate = Mockito.mock(RestTemplate.class);

whenNew(RestTemplate.class).withAnyArguments().thenReturn(restTemplate);

PowerMockito.when(restTemplate.postForObject(
anyString(),
ArgumentMatchers.<HttpEntity<?>>any(),
ArgumentMatchers.<Class<String>>any()
)).thenReturn("ok");
}
// ......any code.......
}

PowerMock 库和 withAnyArguments () 方法帮助了我。

关于java - 资源访问异常 : I/O error on POST request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62146180/

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