【发布时间】:2025-12-19 18:50:11
【问题描述】:
我目前正在为我的 REST-Endpoints 编写一些基本的单元测试。我为此使用Mockito。这里有一个例子:
@MockBean
private MyService service;
@Test
public void getItems() {
Flux<Item> result = Flux.create(sink -> {
sink.next(new Item("1"));
sink.next(new Item("2"));
sink.complete();
});
Mono<ItemParams> params = Mono.just(new ItemParams("1"));
Mockito.when(this.service.getItems(params)).thenReturn(result);
this.webClient.post().uri("/items")
.accept(MediaType.APPLICATION_STREAM_JSON)
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body(BodyInserters.fromPublisher(params, ItemParams.class))
.exchange()
.expectStatus().isOk()
.expectBodyList(Item.class).isEqualTo(Objects.requireNonNull(result.collectList().block()));
}
此实现导致以下错误:
java.lang.AssertionError: Response body expected:<[Item(name=1), Item(name=2)]> but was:<[]>
> POST /items
> WebTestClient-Request-Id: [1]
> Accept: [application/stream+json]
> Content-Type: [application/stream+json]
Content not available yet
< 200 OK
< Content-Type: [application/stream+json;charset=UTF-8]
No content
当我将 Mockito 语句中的参数与 Mockito.any() 交换时
Mockito.when(this.service.getItems(Mockito.any())).thenReturn(result);
测试成功运行。
这意味着由于某种原因,我放入Mockito 语句的params 不等于我放入BodyInserters.fromPublisher(params, ItemParams.class) 的params 对象
那我应该如何测试我的功能呢?
编辑
REST 端点
@PostMapping(path = "/items", consumes = MediaType.APPLICATION_STREAM_JSON_VALUE, produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<Item> getItems(@Valid @RequestBody Mono<ItemParams> itemParms) {
return this.service.getItems(itemParms);
}
【问题讨论】:
-
断言在哪里?您还可以补充一下您是如何模拟该服务的吗?
-
我添加了
MockBean,断言是.expectBodyList(Item.class).isEqualTo(Objects.requireNonNull(result.collectList().block())); -
尝试展示端点实现.. 至少重要的部分
-
我添加了 REST-Endpoint
标签: java unit-testing mocking mockito spring-webflux