微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 wiremock 测试 webflux 代码时出现 500 错误

如何解决使用 wiremock 测试 webflux 代码时出现 500 错误

我有 spring webflux 应用程序,用户控制器类带有端点“/user 和用户服务类。用户服务类调用外部 api。我正在尝试使用 wiremock 和 junit 5 测试服务类来模拟外部api .. 但是我遇到以下错误 ->

021-07-30 18:22:52.511 错误 16974 --- [o-auto-1-exec-2] oaccC[.[.[/].[dispatcherServlet] : servlet.service() 用于 servlet [ dispatcherServlet] 抛出异常

java.net.ConnectException:连接被拒绝

代码上传到路径:https://github.com/neeleshsethi/wiremockdemp/tree/master

似乎找不到控制器,因为在控制器中添加打印语句不会打印任何内容。下面是代码 ->

@Service
public class UserService {

    @Autowired
    WebClient webClient;


    public Mono<User> createuser(User user) {

       return  webClient.post()
                .uri("/usercreate")
               .contentType(MediaType.APPLICATION_JSON)
               .accept(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(user))
                .retrieve()
                .bodyToMono(User.class);

    }



}


wiremock Inti class:
package com.example.wiremockdemo;


import com.github.tomakehurst.wiremock.wiremockServer;
import com.github.tomakehurst.wiremock.core.wiremockConfiguration;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ApplicationContextinitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.event.ContextClosedEvent;

import java.util.Map;

public class wiremockInit implements ApplicationContextinitializer<ConfigurableApplicationContext> {


    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        wiremockServer wiremockServer = new wiremockServer(new wiremockConfiguration().dynamicPort());
        wiremockServer.start();
        applicationContext.addApplicationListener( applicationEvent ->
                {
                        if(applicationEvent instanceof ContextClosedEvent)
                        {
                            wiremockServer.stop();

                        }

                }

        );
        applicationContext.getbeanfactory().registerSingleton("wiremockServer",wiremockServer);
       TestPropertyValues.of("externalBaseUrl",wiremockServer.baseUrl())
              .applyTo(applicationContext);






    }


}


test class:
package com.example.wiremockdemo;

import com.example.wiremockdemo.model.User;
import com.github.tomakehurst.wiremock.wiremockServer;
import com.github.tomakehurst.wiremock.client.wiremock;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBoottest;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.web.reactive.function.BodyInserters;
import reactor.core.publisher.Mono;

import java.awt.*;

import static com.github.tomakehurst.wiremock.client.wiremock.aResponse;

@SpringBoottest(webEnvironment = SpringBoottest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = {wiremockInit.class})
class wiremockdemoApplicationTests {

    @Autowired
    WebTestClient webTestClient;

    @Autowired
    private wiremockServer wiremockServer;

    @LocalServerPort
    private Integer port;


    @Test
    void createusertest() {

        System.out.println("Creating stub");
        wiremockServer.stubFor(


                wiremock.post("/usercreate")
                .willReturn(

                        aResponse()
                            .withHeader("Content-Type",MediaType.APPLICATION_JSON_VALUE)
                            .withBodyFile("response.json"))


        );


    byte[] temp =   webTestClient.post()
                   .uri("http://localhost:" + port + "/user")
                 //    .uri("/user")
            .contentType(MediaType.APPLICATION_JSON)
            //.accept(MediaType.APPLICATION_JSON)
                     .body(BodyInserters.fromValue(createuser()))
                      .exchange()
                      .expectBody()
                     .returnResult()
                .getResponseBody();

    String s = new String(temp);

    System.out.println("Response :" +s);





    }



    public User createuser()
    {
        return  User.builder()
                .firstName("neel")
                .age(32)
                .id(1234)
                .build();
    }


}

解决方法

this line 更改为:

TestPropertyValues.of(Map.of("externalBaseUrl",wireMockServer.baseUrl()));

这是设置测试属性的正确方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。