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

Kotlin中使用GraphQlTester单元测试时如何设置HttpServletRequest请求头

解决GraphQlTester传递请求头的问题

针对Spring Boot + Kotlin的GraphQL项目,使用GraphQlTester单元测试时传递TENANT-CODE和SUB-TENANT-CODE请求头,有两种可行方案:

方案1:单测试方法临时设置请求头

将注入的GraphQlTester转换为HttpGraphQlTester(Spring Boot Web环境下@AutoConfigureGraphQlTester的默认实现),直接调用header()方法添加请求头:

@Test
fun shouldReturnCheckupUserAndSuccessStatusCodeWhenUsingValidFilter() {
    val result = (graphQlTester as HttpGraphQlTester)
        .header("TENANT-CODE", "X")
        .header("SUB-TENANT-CODE", "XX")
        .documentName("checkupUser/filter-checkup-user")
        .variable("page", 1)
        .variable("size", 2)
        .variable("filter", "(like,STRING,refId,)")
        .variable("sortBy", null)
        .execute()
        .path("filterCheckupUser.status")
        .entity(String::class.java).isEqualTo("S0000")
        .path("filterCheckupUser.totalElements")
        .entity(Int::class.java).isEqualTo(2)
        .path("filterCheckupUser.payload[1].vendorAssignedRefId")
        .entity(String::class.java).isEqualTo("...................")
        .path("filterCheckupUser.payload[0].gender")
        .entity(String::class.java).isEqualTo("MALE")
}

方案2:全局配置默认请求头

如果所有测试都需要携带这些请求头,可以手动构建HttpGraphQlTester,通过WebTestClient配置默认请求头:

@SpringBootTest
class CheckupUserTest @Autowired constructor(
    private val checkupUserRepository: CheckupUserRepository,
    private val webApplicationContext: WebApplicationContext,
) {
    private lateinit var graphQlTester: HttpGraphQlTester

    @BeforeEach
    fun setUp() {
        // 初始化带默认请求头的GraphQlTester
        val webTestClient = WebTestClient.bindToApplicationContext(webApplicationContext)
            .defaultHeader("TENANT-CODE", "X")
            .defaultHeader("SUB-TENANT-CODE", "XX")
            .build()
        graphQlTester = HttpGraphQlTester.create(webTestClient)

        // 原有测试数据初始化逻辑
        val visibility = Visibility(
            clientCode = "....",
            tenantCodes = mutableListOf("X", "Y"),
            subTenantCodes = mutableListOf("XX", "YYY")
        )
        val checkupUser = CheckupUser(
            vendorAssignedRefId = "1111111111111111111111111111",
            gender = Gender.FEMALE,
            birthday = LocalDate.of(1996, 6, 26),
            additionalInfo = mutableMapOf("key" to "value"),
            visibility = visibility
        )
        checkupUserRepository.save(checkupUser)
    }

    @Test
    fun shouldReturnCheckupUserAndSuccessStatusCodeWhenUsingValidFilter() {
        val result = graphQlTester.documentName("checkupUser/filter-checkup-user")
            .variable("page", 1)
            .variable("size", 2)
            .variable("filter", "(like,STRING,refId,)")
            .variable("sortBy", null)
            .execute()
            .path("filterCheckupUser.status")
            .entity(String::class.java).isEqualTo("S0000")
            .path("filterCheckupUser.totalElements")
            .entity(Int::class.java).isEqualTo(2)
            .path("filterCheckupUser.payload[1].vendorAssignedRefId")
            .entity(String::class.java).isEqualTo("...................")
            .path("filterCheckupUser.payload[0].gender")
            .entity(String::class.java).isEqualTo("MALE")
    }

    @AfterAll
    fun tearDown() {
        checkupUserRepository.deleteAll()
    }
}

注意事项

  • 上述方案仅适用于HTTP传输的GraphQL端点(Spring GraphQL默认的Servlet场景),如果使用RSocket等其他传输方式,需要对应使用RSocketGraphQlTester并设置元数据。
  • 控制器中通过HttpServletRequest获取请求头的逻辑可以正常接收这些头信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:19:53