【问题标题】:How to setServletPath() in Spring Junit WebTestClient?如何在 Spring Junit WebTestClient 中设置ServletPath()?
【发布时间】:2022-10-18 20:16:48
【问题描述】:
@SpringBootTest(properties = "spring.mvc.servlet.path=/test/path")
@AutoConfigureMockMvc
public class MyTest {
   @Autowired
   private WebTestClient webTestClient

   @Test
   public void test() {
       webTestClient.post()
                .uri(URL)
                .bodyValue(json)
                .exchange()
                .expectStatus().isOk()
                .expectBody(String.class)
                .returnResult()
                .getResponseBody();
   }
}

@RestController
public class MyController {    
    @PostMapping
    public Object post(HttpServletRequest req) {
        System.out.println(req.getServletPath()); //always empty in tests
    }
}

这将创建一个MockHttpServletRequest 发送到@RestContoller servlet。

问题:我的 servlet 使用了HttpServletRequest.getServletPath(),但使用上面的WebTestClient 方法总是为空。

问题:如何在我的 junit 测试中显式设置servletPath

【问题讨论】:

  • 使用 Mockito 或其他东西模拟 HttpServletRequest.getServletPath() 方法怎么样?你需要来自 httpServletRequest 的其他值吗?
  • 好吧,但我自己没有创建MockHttpServletRequest / HttpServletRequest。它是由 Spring 在内部由 WebTestClient 构建器进程创建的......我必须找到一种方法在 WebTestClient 发送之前拦截 MockHttpServletRequest
  • 如果它被创建为一个空对象,并且模拟它可以覆盖该对象,那么您应该尝试一下吗?
  • 是否可以在测试环境中将spring.mvc.servlet.path 设置为某个固定值?
  • @stevecross 是的,这是可能的,但 HttpServletRequest.getServletPath() 仍然是空的。

标签: java spring spring-boot spring-webflux spring-boot-test


【解决方案1】:

我可以按如下方式解决它,但由于这真的很hacky,我仍然希望有一个适当的解决方案。

@TestConfiguration
static class ServletPathMockConfiguration {
    @Bean
    public Filter filter() {
        return (request, response, filterchain) -> {
            Object req = request;
            while (req instanceof ServletRequestWrapper) {
                req = ((ServletRequestWrapper) req).getRequest();
            }
            
            if (req instanceof MockHttpServletRequest)
                ((MockHttpServletRequest) req).setServletPath("/junit/mock/path");

            filterchain.doFilter(request, response);
        };
    }
}

【讨论】:

    【解决方案2】:

    一个解决方案是计算路径:request.getServletPath() returned null from Spring MVC

    在测试中以及在生产中为我完成了这项工作。

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 2022-08-15
      • 2019-10-21
      • 2020-08-26
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多