use*_*909 6 spring spring-test spring-webflux
我有一个控制器
@RestController
public class NameController {
@Autowired
private NameService nameService;
@GetMapping("/name")
public Mono<UploadParamsDto> getName(ServerHttpRequest request) {
return nameService.getNameByHost(request.getRemoteAddress().getHostName());
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个测试方法:
@ExtendWith(SpringExtension.class)
@WebFluxTest(NameControllerTest.class)
@ActiveProfiles("test")
class NameControllerTest {
@Autowired
private WebTestClient webClient;
@Test
void nameTest() {
webClient.get().uri("/name")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus()
.isOk();
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试以检查我的 getName 方法时,我得到了 NPE,因为 request.getRemoteAddress() 返回 null,你能告诉我如何模拟 ServerHttpRequest 吗?(我知道有 MockServerHttpRequest,但我无法使用它)
我的目的是让 request.getRemoteAddress().getHostName() 返回模拟值。
谢谢大家。以如下方式工作:
@ExtendWith(SpringExtension.class)
@WebFluxTest(NameControllerTest.class)
@ActiveProfiles("test")
class NameControllerTest {
@Autowired
private ApplicationContext context;
@Test
void nameTest() {
WebTestClient webClient = WebTestClient
.bindToApplicationContext(context)
.webFilter(new SetRemoteAddressWebFilter("127.0.0.1"))
.configureClient()
.build();
webClient.get().uri("/name")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus()
.isOk();
}
}
Run Code Online (Sandbox Code Playgroud)
其中 SetRemoteAddressWebFilter 是 WebFilter:
public class SetRemoteAddressWebFilter implements WebFilter {
private String host;
public SetRemoteAddressWebFilter(String host) {
this.host = host;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(decorate(exchange));
}
private ServerWebExchange decorate(ServerWebExchange exchange) {
final ServerHttpRequest decorated = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public InetSocketAddress getRemoteAddress() {
return new InetSocketAddress(host, 80);
}
};
return new ServerWebExchangeDecorator(exchange) {
@Override
public ServerHttpRequest getRequest() {
return decorated;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
运行测试@WebFluxTest不涉及真正的服务器,您已经弄清楚了。
但获得 aNullPointerException感觉仍然不对 - 你能在https://jira.spring.io上创建一个关于此的问题吗?我认为您不必解决这个问题,但 Spring Framework 可能应该提供一些基础设施来“模拟”该信息。
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |