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

Spring-WebFlux:处理程序函数单元测试引发UnsupportedMediaTypeStatusException

周志文
2023-03-14

我试图为处理程序函数编写单元测试,我遵循了Spring项目的示例。有人能帮助我为什么下面的测试抛出UnsupportedMediatypeStatusException吗?

public Mono<ServerResponse> handle(ServerRequest serverRequest) {
        log.info("{} Processing create request", serverRequest.exchange().getLogPrefix());

        return ok().body(serverRequest.bodyToMono(Person.class).map(p -> p.toBuilder().id(UUID.randomUUID().toString()).build()), Person.class);
    }
@SpringBootTest
@RunWith(SpringRunner.class)
public class MyHandlerTest {

    @Autowired
    private MyHandler myHandler;
    private ServerResponse.Context context;

    @Before
    public void createContext() {
        HandlerStrategies strategies = HandlerStrategies.withDefaults();
        context = new ServerResponse.Context() {
            @Override
            public List<HttpMessageWriter<?>> messageWriters() {
                return strategies.messageWriters();
            }

            @Override
            public List<ViewResolver> viewResolvers() {
                return strategies.viewResolvers();
            }
        };
    }

    @Test
    public void handle() {

        Gson gson = new Gson();

        MockServerWebExchange exchange = MockServerWebExchange.from(
                MockServerHttpRequest.post("/api/create")
                        .body(gson.toJson(Person.builder().firstName("Jon").lastName("Doe").build())));

        MockServerHttpResponse mockResponse = exchange.getResponse();

        ServerRequest serverRequest = ServerRequest.create(exchange, HandlerStrategies.withDefaults().messageReaders());

        Mono<ServerResponse> serverResponseMono = myHandler.handle(serverRequest);

        Mono<Void> voidMono = serverResponseMono.flatMap(response -> {
            assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
            boolean condition = response instanceof EntityResponse;
            assertThat(condition).isTrue();
            return response.writeTo(exchange, context);
        });

        StepVerifier.create(voidMono)
                .expectComplete().verify();

        StepVerifier.create(mockResponse.getBody())
                .consumeNextWith(a -> System.out.println(a))
                .expectComplete().verify();

        assertThat(mockResponse.getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_JSON);

    }
}

错误消息:java.lang.AssertionError:Expected“ExpectComplete”失败(Expected:onComplete();实际:onError(org.springframework.web.server.unsupportedMediatypeStatusException:415 UNSUPPORTED_MEDIA_TYPE“content type'application/octet-stream'not supported for bodytype=com.example.demo.person”))

共有1个答案

凤晨朗
2023-03-14

我发现我错过了模拟请求的.contenttype(Mediatype.application_json)

MockServerWebExchange.from(
                MockServerHttpRequest.post("/api/create").contentType(MediaType.APPLICATION_JSON)
                        .body(gson.toJson(Person.builder().firstName("Jon").lastName("Doe").build())));

解决了我的问题。

 类似资料:
  • 问题内容: 对反应式编程感兴趣,我玩了《构建反应式RESTful Web服务》指南。并希望转移前途并添加一些单元测试。 我尝试使用普通的Junit / Mockito测试来测试我的处理程序()。但是,由于它是反应性的,因此处理程序将返回。所以我不得不用它来测试状态,但是无法抽出他的身体来测试它。在网络上搜索解决方案时,似乎所有示例都使用。 我的问题是: 鉴于所有示例都用于测试反应性REST服务,并

  • 对反应性编程感兴趣,我玩了一点构建反应性RESTful网络服务指南。并希望将其移至原版本并添加一些单元测试。 我试图用普通的Junit/Mockito测试来测试我的处理程序()。但是,因为它是被动的,所以处理程序返回一个

  • 问题内容: 我有一个实现一些WKNavigationDelegate函数的UIViewController,并且我想对这些函数中的逻辑进行单元测试。这是一个例子: 我希望我的单元测试确保基于WKNavigationAction的request.url用正确的WKNavigationActionPolicy调用DecisionHandler。 但是,我不知道如何测试此功能。当我运行测试项目时,在We

  • 我的阅读器配置如下: 另外,在读取器进入测试方法之前,不调用open(executionContext)方法,这是不对的,因为我使用这些作业参数来检索调用读取方法时需要可用的一些数据。这可能与上面的问题有关,因为关于使用后期绑定进行测试的文档说“读取器被初始化并绑定到输入数据”。

  • 我正在我的项目中使用spring webflux。我的controller类调用返回Mono或Flux的服务类方法。 我正在尝试为我的服务类编写单元测试。我不确定如何为返回mono/flux的方法编写单元测试。我查看的大多数文章都建议我使用WebClientTest。但重点是,我在这里测试我的服务类。当我通过模拟服务类方法测试我的web层(控制器类)时,我使用了WebclientTest。 对如何

  • 我有一个Java项目,它使用了一些Azure函数,如HttpTrigger和QueueTrigger。我使用原型来生成这个项目,因此它可以使用HttpTrigger的一些样板代码和它的单元测试,但对QueueTrigger没有任何帮助。我正试图得到帮助,为这个QueueTrigger编写一个好的单元测试,它实际上是从队列中读取消息(弹出)。队列的代码如下所示: 有没有人能推荐一下这个队列触发azu