在我的生产代码中,我需要对响应StreamingResponseBody.的控制器执行POST命令这类守则的一个简短例子是:
@RestController
@RequestMapping("/api")
public class DalaLakeRealController {
@PostMapping(value = "/downloaddbcsv", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<StreamingResponseBody> downloadDBcsv(@Valid @RequestBody SearchQuery searchRequest) {
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_TYPE, "application/csv")
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=demoStream.csv")
.body(
get3Lines()
);
}
public StreamingResponseBody get3Lines() {
StreamingResponseBody streamingResponseBody = new StreamingResponseBody() {
@Override
public void writeTo(OutputStream outputStream) throws IOException {
outputStream.write("LineNumber111111111\n".getBytes());
outputStream.write("LineNumber222222222\n".getBytes());
outputStream.write("LineNumber333333333\n".getBytes());
}
};
return streamingResponseBody;
}
}在测试中,我想模拟这个控制器的响应。我阅读了以下链接:模拟外部控制器的使用MockRestServiceServer测试REST客户端。
但是,在ClientHttpResponse of mockServer一书中,它预计会出现andRespond或ResponseCreator。
mockServer.expect(once(), requestTo("http://localhost:8080/api/downloaddbcsv"))
.andRespond(withSuccess("{message : 'under construction'}", MediaType.APPLICATION_JSON));如何使用StreamingResponseBody在MockRestServiceServer中响应?
发布于 2020-05-11 08:03:16
我希望这能指引你..。
@Test
public void whenTopicNotExistsThenTopicNotFound() throws IOException, NakadiException {
when(eventTypeRepository.findByName(TEST_EVENT_TYPE_NAME)).thenThrow(NoSuchEventTypeException.class);
final StreamingResponseBody responseBody = createStreamingResponseBody();
final Problem expectedProblem = Problem.valueOf(NOT_FOUND, "topic not found");
assertThat(responseToString(responseBody), TestUtils.JSON_TEST_HELPER.matchesObject(expectedProblem));
}其想法是将StreamingResponseBody转换为String。然后你就可以做这样的事情:
mockServer.expect(once(), requestTo("http://localhost:8080/api/downloaddbcsv"))
.andRespond(withSuccess(responseToString(responseBody), MediaType.APPLICATION_JSON));streamingResponseBody()和responseEntity()测试方法将响应转换为String。
发布于 2021-12-08 04:40:52
虽然这篇文章已经过时了,但这个答案可能会帮助现在的人。
这个问题的答案是功能接口( Functional,streamingResponseBody),如下面的代码所示,再加上cloudStorageService中下载的模拟返回。
@Test
@WithUserDetailsMock(
email = "participant@localhost",
authorities = AuthoritiesConstants.USER,
cashflowAuthorities = CashflowAuthoritiesConstants.PARTICIPANT
)
void testDownloadFileThenSuccess() throws Exception {
Member loggedMember = memberService.getLoggedMember();
File file = EntityBuilder.file(loggedMember.getGroup()).build(fileRepository::save);
SubmittedPayment submittedPayment = EntityBuilder
.submittedPayment(loggedMember)
.with(SubmittedPayment::setFile, file)
.build(submittedPaymentRepository::save);
String endpoint = String.format("/api/payment/submit/%d/file", submittedPayment.getId());
byte[] fileBytes = "some content".getBytes();
StreamingResponseBody streamingResponseBody = objectStream -> {
var mockInputStream = new ByteArrayInputStream(fileBytes);
try (mockInputStream) {
byte[] bytes = mockInputStream.readAllBytes();
objectStream.write(bytes, 0, bytes.length);
}
};
doReturn(streamingResponseBody).when(cloudStorageService).download(fileArgumentCaptor.capture());
MvcResult response = restTransactionMockMvc.perform(get(endpoint)).andExpect(status().isOk()).andReturn();
assertThat(file).isEqualTo(fileArgumentCaptor.getValue());
assertThat(Arrays.equals(fileBytes, response.getResponse().getContentAsByteArray())).isTrue();
}https://stackoverflow.com/questions/61045521
复制相似问题