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
相关产品推荐
相关产品推荐

