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

Spring Boot 3与Java17环境下HttpGraphQlClient单元测试实现求助

Spring Boot 3 + Java 17 中 HttpGraphQlClient 单元测试实现方案

针对你用HttpGraphQlClient调用GraphQL接口的方法,这里提供两种可行的单元测试方案,替代你尝试的RestAssured方式:


方案一:Mock HttpGraphQlClient 调用链

直接模拟HttpGraphQlClient的各个调用环节,无需依赖真实后端接口,适合纯单元测试场景。

测试代码示例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.graphql.client.HttpGraphQlClient;
import org.springframework.graphql.client.ResponseSpec;
import reactor.core.publisher.Mono;

import java.util.List;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;

@SpringBootTest
class YourServiceTest {

    @Autowired
    private YourService yourService; // 替换为你的服务类实际名称

    @MockBean
    private HttpGraphQlClient httpGraphQlClient;

    @MockBean
    private HttpGraphQlClient.DocumentSpec documentSpec;

    @MockBean
    private ResponseSpec responseSpec;

    @Test
    void callApi_shouldProcessPokemonList() {
        // 模拟调用链的返回结果
        when(httpGraphQlClient.document(anyString())).thenReturn(documentSpec);
        when(documentSpec.retrieve(anyString())).thenReturn(responseSpec);
        when(responseSpec.toEntity(List.class)).thenReturn(Mono.just(List.of("Pikachu", "Charmander")));

        // 执行目标方法
        yourService.callApi();

        // 验证关键方法是否按预期调用
        verify(httpGraphQlClient).document("test");
        verify(documentSpec).retrieve("pokemon");
    }
}

方案二:用MockWebServer模拟后端GraphQL服务

通过MockWebServer搭建一个模拟的GraphQL接口,验证请求格式和响应处理逻辑,更贴近真实调用场景。

1. 添加测试依赖

如果使用Maven,在pom.xml中加入:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>mockwebserver</artifactId>
    <scope>test</scope>
</dependency>

2. 测试代码示例

import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.graphql.client.HttpGraphQlClient;
import org.springframework.web.reactive.function.client.WebClient;

import java.io.IOException;
import java.util.List;

class YourServiceTest {

    private static MockWebServer mockWebServer;
    private YourService yourService;

    @BeforeAll
    static void startMockServer() throws IOException {
        mockWebServer = new MockWebServer();
        mockWebServer.start();
    }

    @BeforeEach
    void initService() {
        // 创建指向MockWebServer的HttpGraphQlClient
        WebClient webClient = WebClient.builder()
                .baseUrl(mockWebServer.url("/graphql").toString())
                .build();
        HttpGraphQlClient httpGraphQlClient = HttpGraphQlClient.create(webClient);
        yourService = new YourService(httpGraphQlClient); // 假设服务类支持构造注入
    }

    @AfterAll
    static void shutdownMockServer() throws IOException {
        mockWebServer.shutdown();
    }

    @Test
    void callApi_shouldReceiveValidPokemonResponse() {
        // 构造模拟的GraphQL响应
        String mockResponse = """
                {
                    "data": {
                        "pokemon": ["Bulbasaur", "Squirtle"]
                    }
                }
                """;
        mockWebServer.enqueue(new MockResponse()
                .setResponseCode(200)
                .setHeader("Content-Type", "application/json")
                .setBody(mockResponse));

        // 执行目标方法
        yourService.callApi();

        // 可选:验证请求格式是否符合预期
        // RecordedRequest request = mockWebServer.takeRequest();
        // String requestBody = request.getBody().readUtf8();
        // 断言requestBody包含GraphQL查询"test"
    }
}

关于RestAssured的补充说明

RestAssured并非不能用,但需要手动构造GraphQL的POST请求体(包含query字段),而上述两种方案更贴合HttpGraphQlClient的使用场景,无需额外拼接请求格式,测试逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:06:23