0

我有带有端点“/用户和用户服务类的用户控制器类的spring webflux应用程序。用户服务类调用外部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();
    }


}
4

1 回答 1

0

将此行更改为:

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

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

于 2021-07-31T12:45:13.970 回答