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

