我目前正在为我的REST端点编写一些基本的单元测试。我使用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()));
。 - Mulgard