首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在测试中模拟StreamingResponseBody?

如何在测试中模拟StreamingResponseBody?
EN

Stack Overflow用户
提问于 2020-04-05 16:09:28
回答 2查看 3.4K关注 0票数 2

在我的生产代码中,我需要对响应StreamingResponseBody.的控制器执行POST命令这类守则的一个简短例子是:

代码语言:javascript
复制
@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

代码语言:javascript
复制
mockServer.expect(once(), requestTo("http://localhost:8080/api/downloaddbcsv"))
    .andRespond(withSuccess("{message : 'under construction'}", MediaType.APPLICATION_JSON));

如何使用StreamingResponseBodyMockRestServiceServer中响应?

EN

回答 2

Stack Overflow用户

发布于 2020-05-11 08:03:16

我希望这能指引你..。

代码语言:javascript
复制
@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));
}

从:https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody获得上述代码

其想法是将StreamingResponseBody转换为String。然后你就可以做这样的事情:

代码语言:javascript
复制
mockServer.expect(once(), requestTo("http://localhost:8080/api/downloaddbcsv"))
.andRespond(withSuccess(responseToString(responseBody), MediaType.APPLICATION_JSON));

此外,在这里看一看:https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/StreamingResponseBodyReturnValueHandlerTests.java

streamingResponseBody()responseEntity()测试方法将响应转换为String

票数 0
EN

Stack Overflow用户

发布于 2021-12-08 04:40:52

虽然这篇文章已经过时了,但这个答案可能会帮助现在的人。

这个问题的答案是功能接口( Functional,streamingResponseBody),如下面的代码所示,再加上cloudStorageService中下载的模拟返回。

代码语言:javascript
复制
    @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();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61045521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档