Spring's WebClient hanging on bodyToMono(Pojo) with MockServer





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I want to mock an external API, which I am calling as part of my service. Therefore, I wanted to use the MockWebServer from okhttp3. My problem is that the call to bodyToMono works fine, if I want to retrieve the body as string, but does not work when retrieving it as data class. I tried to trim it down using the following code snippet:



public class MockWebClientTest {

private MockWebServer server;

@BeforeEach
public void setUp() throws IOException {
server = new MockWebServer();
server.start(9876);
}

@AfterEach
public void tearDown() throws IOException {
server.shutdown();
}

@Test
public void stringWorks() throws JsonProcessingException {
createMockedTokenCall();

Mono<String> response = WebClient.create(this.server.url("/").toString())
.get()
.uri("/")
.retrieve()
.bodyToMono(String.class);

System.out.println(response.block());
}

@Test
public void classDoesNotWork() {
createMockedTokenCall();

Mono<AuthToken> response = WebClient.create(this.server.url("/").toString())
.get()
.uri("/")
.retrieve()
.bodyToMono(AuthToken.class);

System.out.println(response.block());
}

private void createMockedTokenCall() {
server.enqueue(new MockResponse().setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
}
}

class AuthToken {
private String accessToken;
private String refreshToken;

//constructor
}


The first Test (stringWorks) is working fine and return the correct json representation. However, the second test (classDoesNotWork) hangs forever on the bodyToMono call.



My guess is that it has nothing to do with the okttp3 library directly, since I had the same error using Wiremock. The same code works however when targeting a real API endpoint. Unfortunately, I could not find another way to test my calls using WebClient since Spring currently has no direct mocking support for it (see SPR-15286).



I am really looking forward to help on that matter! Thanks in advance!



General remark: This is basically a more or less copy of test case shouldReceiveJsonAsPojo in https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java










share|improve this question































    0















    I want to mock an external API, which I am calling as part of my service. Therefore, I wanted to use the MockWebServer from okhttp3. My problem is that the call to bodyToMono works fine, if I want to retrieve the body as string, but does not work when retrieving it as data class. I tried to trim it down using the following code snippet:



    public class MockWebClientTest {

    private MockWebServer server;

    @BeforeEach
    public void setUp() throws IOException {
    server = new MockWebServer();
    server.start(9876);
    }

    @AfterEach
    public void tearDown() throws IOException {
    server.shutdown();
    }

    @Test
    public void stringWorks() throws JsonProcessingException {
    createMockedTokenCall();

    Mono<String> response = WebClient.create(this.server.url("/").toString())
    .get()
    .uri("/")
    .retrieve()
    .bodyToMono(String.class);

    System.out.println(response.block());
    }

    @Test
    public void classDoesNotWork() {
    createMockedTokenCall();

    Mono<AuthToken> response = WebClient.create(this.server.url("/").toString())
    .get()
    .uri("/")
    .retrieve()
    .bodyToMono(AuthToken.class);

    System.out.println(response.block());
    }

    private void createMockedTokenCall() {
    server.enqueue(new MockResponse().setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
    }
    }

    class AuthToken {
    private String accessToken;
    private String refreshToken;

    //constructor
    }


    The first Test (stringWorks) is working fine and return the correct json representation. However, the second test (classDoesNotWork) hangs forever on the bodyToMono call.



    My guess is that it has nothing to do with the okttp3 library directly, since I had the same error using Wiremock. The same code works however when targeting a real API endpoint. Unfortunately, I could not find another way to test my calls using WebClient since Spring currently has no direct mocking support for it (see SPR-15286).



    I am really looking forward to help on that matter! Thanks in advance!



    General remark: This is basically a more or less copy of test case shouldReceiveJsonAsPojo in https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java










    share|improve this question



























      0












      0








      0








      I want to mock an external API, which I am calling as part of my service. Therefore, I wanted to use the MockWebServer from okhttp3. My problem is that the call to bodyToMono works fine, if I want to retrieve the body as string, but does not work when retrieving it as data class. I tried to trim it down using the following code snippet:



      public class MockWebClientTest {

      private MockWebServer server;

      @BeforeEach
      public void setUp() throws IOException {
      server = new MockWebServer();
      server.start(9876);
      }

      @AfterEach
      public void tearDown() throws IOException {
      server.shutdown();
      }

      @Test
      public void stringWorks() throws JsonProcessingException {
      createMockedTokenCall();

      Mono<String> response = WebClient.create(this.server.url("/").toString())
      .get()
      .uri("/")
      .retrieve()
      .bodyToMono(String.class);

      System.out.println(response.block());
      }

      @Test
      public void classDoesNotWork() {
      createMockedTokenCall();

      Mono<AuthToken> response = WebClient.create(this.server.url("/").toString())
      .get()
      .uri("/")
      .retrieve()
      .bodyToMono(AuthToken.class);

      System.out.println(response.block());
      }

      private void createMockedTokenCall() {
      server.enqueue(new MockResponse().setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
      }
      }

      class AuthToken {
      private String accessToken;
      private String refreshToken;

      //constructor
      }


      The first Test (stringWorks) is working fine and return the correct json representation. However, the second test (classDoesNotWork) hangs forever on the bodyToMono call.



      My guess is that it has nothing to do with the okttp3 library directly, since I had the same error using Wiremock. The same code works however when targeting a real API endpoint. Unfortunately, I could not find another way to test my calls using WebClient since Spring currently has no direct mocking support for it (see SPR-15286).



      I am really looking forward to help on that matter! Thanks in advance!



      General remark: This is basically a more or less copy of test case shouldReceiveJsonAsPojo in https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java










      share|improve this question
















      I want to mock an external API, which I am calling as part of my service. Therefore, I wanted to use the MockWebServer from okhttp3. My problem is that the call to bodyToMono works fine, if I want to retrieve the body as string, but does not work when retrieving it as data class. I tried to trim it down using the following code snippet:



      public class MockWebClientTest {

      private MockWebServer server;

      @BeforeEach
      public void setUp() throws IOException {
      server = new MockWebServer();
      server.start(9876);
      }

      @AfterEach
      public void tearDown() throws IOException {
      server.shutdown();
      }

      @Test
      public void stringWorks() throws JsonProcessingException {
      createMockedTokenCall();

      Mono<String> response = WebClient.create(this.server.url("/").toString())
      .get()
      .uri("/")
      .retrieve()
      .bodyToMono(String.class);

      System.out.println(response.block());
      }

      @Test
      public void classDoesNotWork() {
      createMockedTokenCall();

      Mono<AuthToken> response = WebClient.create(this.server.url("/").toString())
      .get()
      .uri("/")
      .retrieve()
      .bodyToMono(AuthToken.class);

      System.out.println(response.block());
      }

      private void createMockedTokenCall() {
      server.enqueue(new MockResponse().setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
      }
      }

      class AuthToken {
      private String accessToken;
      private String refreshToken;

      //constructor
      }


      The first Test (stringWorks) is working fine and return the correct json representation. However, the second test (classDoesNotWork) hangs forever on the bodyToMono call.



      My guess is that it has nothing to do with the okttp3 library directly, since I had the same error using Wiremock. The same code works however when targeting a real API endpoint. Unfortunately, I could not find another way to test my calls using WebClient since Spring currently has no direct mocking support for it (see SPR-15286).



      I am really looking forward to help on that matter! Thanks in advance!



      General remark: This is basically a more or less copy of test case shouldReceiveJsonAsPojo in https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java







      java spring okhttp3 spring-webflux






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 16 '18 at 14:13







      Michael Altenburger

















      asked Nov 16 '18 at 12:58









      Michael AltenburgerMichael Altenburger

      677210




      677210
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Ok, after looking at the linked test and doing a bit of comparison, I found the solution (or my bug so to say): I forgot the correct Content-Type header. So it works using the following:



          private void createMockedTokenCall() {
          server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
          }


          Apart from me doing a mistake, I really think that this should not result in an infinite hanging of the application...






          share|improve this answer
























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338409%2fsprings-webclient-hanging-on-bodytomonopojo-with-mockserver%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Ok, after looking at the linked test and doing a bit of comparison, I found the solution (or my bug so to say): I forgot the correct Content-Type header. So it works using the following:



            private void createMockedTokenCall() {
            server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
            }


            Apart from me doing a mistake, I really think that this should not result in an infinite hanging of the application...






            share|improve this answer




























              0














              Ok, after looking at the linked test and doing a bit of comparison, I found the solution (or my bug so to say): I forgot the correct Content-Type header. So it works using the following:



              private void createMockedTokenCall() {
              server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
              }


              Apart from me doing a mistake, I really think that this should not result in an infinite hanging of the application...






              share|improve this answer


























                0












                0








                0







                Ok, after looking at the linked test and doing a bit of comparison, I found the solution (or my bug so to say): I forgot the correct Content-Type header. So it works using the following:



                private void createMockedTokenCall() {
                server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
                }


                Apart from me doing a mistake, I really think that this should not result in an infinite hanging of the application...






                share|improve this answer













                Ok, after looking at the linked test and doing a bit of comparison, I found the solution (or my bug so to say): I forgot the correct Content-Type header. So it works using the following:



                private void createMockedTokenCall() {
                server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{"accessToken":"BARBAR","refreshToken":"FOOFOO"}"));
                }


                Apart from me doing a mistake, I really think that this should not result in an infinite hanging of the application...







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 16 '18 at 14:25









                Michael AltenburgerMichael Altenburger

                677210




                677210
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338409%2fsprings-webclient-hanging-on-bodytomonopojo-with-mockserver%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Florida Star v. B. J. F.

                    Danny Elfman

                    Retrieve a Users Dashboard in Tumblr with R and TumblR. Oauth Issues