You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mock RestClient.RequestBodyUriSpec body返回null问题及any()失效疑问

问题:Mock RestClient.RequestBodyUriSpec的body方法时返回null

问题描述

Mock RestClient.RequestBodyUriSpec的body方法时,RestClient调用链中该方法返回null。

测试用例

package org.mytest.tests;

import org.junit.jupiter.api.Test;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestClient;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

class RestClientTest {

    @Test
    void mockRestClientTest() {
        // 创建RestClient及其组件的Mock对象
        RestClient restClient = mock(RestClient.class);

        RestClient.RequestBodyUriSpec requestBodyUriSpecMock = mock(RestClient.RequestBodyUriSpec.class);
        when(restClient.method(any())).thenReturn(requestBodyUriSpecMock);

        RestClient.RequestBodySpec requestBodySpecMock = mock(RestClient.RequestBodySpec.class);
        RestClient.ResponseSpec responseSpecMock = mock(RestClient.ResponseSpec.class);

        // 定义链式调用的行为
        when(restClient.method(any())).thenReturn(requestBodyUriSpecMock);
        when(requestBodyUriSpecMock.uri(anyString())).thenReturn(requestBodySpecMock);
        when(requestBodySpecMock.headers(any())).thenReturn(requestBodySpecMock);

        when(requestBodySpecMock.headers(any()).body(any())).thenReturn(requestBodySpecMock);
        when(requestBodySpecMock.body(any())).thenReturn(requestBodySpecMock);
        when(requestBodySpecMock.body(any(), any())).thenReturn(requestBodySpecMock);
        when(requestBodyUriSpecMock.body(any(Object.class))).thenReturn(requestBodySpecMock);
        when(requestBodySpecMock.retrieve()).thenReturn(responseSpecMock);
        when(responseSpecMock.toEntity(String.class)).thenReturn(new ResponseEntity<>("responseBody", HttpStatus.OK));

        // 测试Mock结果
        RestClient.RequestBodySpec result = requestBodySpecMock.headers(any());
        System.out.println("Mock requestBodySpecMock.headers -> " + result);

        result = requestBodySpecMock.body(any());
        System.out.println("Mock requestBodySpecMock.body -> " + result);

        RestClient.ResponseSpec responseResult = requestBodySpecMock.retrieve();
        System.out.println("Mock requestHeadersSpecMock.retrieve -> " + responseResult);

        result = requestBodySpecMock.headers(any()).body(any());
        System.out.println("Mock requestBodySpecMock.headers.body -> " + result);

        RestClient.RequestBodySpec requestBodySpec = restClient.method(HttpMethod.POST)
                .uri("https://localhost/my-server/")
                .headers(
                        HttpHeaders::clear)
                .body("SomeBody");

        System.out.println("RequestBodySpec -> " + requestBodySpec);

        ResponseEntity<String> resultStr = restClient.method(HttpMethod.POST)
                .uri("https://localhost/my-server/")
                .headers(
                        HttpHeaders::clear)
                .body("Some Body")
                .retrieve()
                .toEntity(String.class);

        System.out.println(resultStr);
    }
}

打印输出结果

Mock requestBodySpecMock.headers -> Mock for RequestBodySpec, hashCode: 836972194
Mock requestBodySpecMock.body -> Mock for RequestBodySpec, hashCode: 836972194
Mock requestHeadersSpecMock.retrieve -> Mock for ResponseSpec, hashCode: 556945462
Mock requestBodySpecMock.headers.body -> Mock for RequestBodySpec, hashCode: 836972194
RequestBodySpec -> null

问题点

以下调用链中,body("SomeBody")本应返回Mock的requestBodySpecMock对象,但实际返回null:

RestClient.RequestBodySpec requestBodySpec = restClient.method(HttpMethod.POST)
                .uri("https://localhost/my-server/")
                .headers(
                        HttpHeaders::clear)
                .body("SomeBody");

解决方法与疑问

通过使用when(requestBodySpecMock.body(anyString())).thenReturn(requestBodySpecMock)来Mock body方法后,问题解决,调用链正常返回Mock对象。但疑问在于:为什么使用any()匹配器时无法生效?


内容的提问来源于stack exchange,提问作者Rupesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:24:59