簡體   English   中英

Spring Boot-集成測試-WebTestClient和HttpServletRequest

[英]Spring boot - integration testing - WebTestClient & HttpServletRequest

我很難弄清楚這一點。

我幾乎可以模擬所有內容,但出於某種原因,可以模擬HttpServletRequest ,但不能將其注入@ControllerAdvice @ExceptionHandler方法。

有任何想法嗎? 提前謝謝你的幫助!

STR Repo具有最少的即插即用測試套件/代碼

https://github.com/krodyrobi/spring-integration-test-str

@Component
public class Config {
  private final String url = "https://httpstat.us/";

  public String getUrl() {
    return url;
  }
}

@RestControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(WebClientResponseException.class)
  public ResponseEntity<String> handleException(HttpServletRequest request, WebClientResponseException ex) {
    return new ResponseEntity<>(request.getRequestURL() + " " + ex.getResponseBodyAsString(), ex.getStatusCode());
    }
}



@RestController
public class SomeController {
  private final Config config;

  @Autowired
  public SomeController(Config config) {
    this.config = config;
  }

  @GetMapping("/test")
  public Mono<String> test() {
     return WebClient
       .create(config.getUrl())
       .get()
       .uri("/200")
       .retrieve()
       .bodyToMono(String.class);
  }
}


@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
  SomeController.class,
  GlobalExceptionHandler.class,
})
public class SomeControllerTest {
  private final static String baseUrl = "http://localhost:9999/";

  public @Rule WireMockRule wireMockRule = new WireMockRule(9999);

  private @MockBean Config config;
  private @MockBean HttpServletRequest request;

  private WebTestClient webClient;

  private @Autowired SomeController controller;
  private @Autowired GlobalExceptionHandler exceptionHandler;

  @Before
  public void setUp() {
    webClient = WebTestClient
      .bindToController(controller)
      .controllerAdvice(exceptionHandler)
      .build();

    when(config.getUrl()).thenReturn(baseUrl);
  }

  @Test
  public void test_works() {
    wireMockRule
      .stubFor(get(urlEqualTo("/200"))
      .willReturn(aResponse()
                    .withStatus(200)
                    .withHeader("Content-Type", "text/plain")
                    .withBody("200 MOCK")));

    webClient
      .get()
      .uri("/test")
      .exchange()
      .expectStatus()
      .isOk()
      .expectBody(String.class)
      .isEqualTo("200 MOCK");

    wireMockRule.verify(getRequestedFor(urlMatching("/200")));
  }

  @Test
  public void test_fails() {
    // java.lang.IllegalStateException: No suitable resolver for argument 0 
    // of type 'javax.servlet.http.HttpServletRequest' on public 
    // org.springframework.http.ResponseEntity<java.lang.String> 
    // com.example.demo.GlobalExceptionHandler.handleException(
    //   javax.servlet.http.HttpServletRequest,
    //   ...client.WebClientResponseException
    // )

    wireMockRule
      .stubFor(get(urlEqualTo("/200"))
      .willReturn(aResponse()
                    .withStatus(404)
                    .withHeader("Content-Type", "text/plain")
                    .withBody("404 MOCK")));

    webClient
       .get()
       .uri("/test")
       .exchange()
       .expectStatus()
       .isNotFound()
       .expectBody(String.class)
       .isEqualTo("Http://localhost:8080/test 404 MOCK");

    wireMockRule.verify(getRequestedFor(urlMatching("/200")));
  }
}

在下面使用而不是HttpServletRequest

import org.springframework.http.server.reactive.ServerHttpRequest;

ServerHttpRequest request

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM