问题描述
我有 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()));
这是设置测试属性的正确方法。