模拟 HTTP 响应(实验性)
ℹ️ MockServer
仍然是实验性的,大部分 API 都是针对 Kotlin 设计的。MockServer
是跨平台的,但如果您只使用 Java,我们推荐使用 OkHttp MockWebServer,这将提供惯用的 Java API。
MockServer
实现了一个 HTTP 服务器,您可以使用它来模拟响应。它对于测试特定的服务器行为非常有用,例如错误情况、HTTP 头和超时。使用它需要最小化对生产代码的修改,因为您只需要更改您的 serverUrl
。
另请参阅 TestNetworkTransport
,它处理在 GraphQL 级别而不是 HTTP 级别进行模拟。
将依赖项添加到项目的 build.gradle
文件中:
build.gradle[.kts]
dependencies {testImplementation("com.apollographql.apollo3:apollo-mockserver:3.8.5")}
以下是如何使用它的方法
// Create a mock serverval mockServer = MockServer()// Provide its URL to your ApolloClientval apolloClient = ApolloClient.Builder().serverUrl(mockServer.url()).store(store).build()// Enqueue HTTP responsesmockServer.enqueue("""{"data": {"random": 42}}""")mockServer.enqueue(MockResponse(body = "Internal server error",statusCode = 500,headers = mapOf("X-Test" to "true"),// Optionally pass a delay to simulate network latencydelayMillis = 1000L,))// Execute queriesval response1 = apolloClient.query(GetRandomQuery()).execute()val response2 = apolloClient.query(GetRandomQuery()).execute()// Don't forget to stop the server when you're donemockServer.stop()
默认情况下,enqueue
函数通常接受一个MockResponse
作为参数,但也支持简写版本,该版本接受一个String
(上面都显示了)。
高级用法
默认情况下,MockServer
配置了QueueMockServerHandler
,它以队列中顺序返回响应。如果你需要更多控制返回响应,可以实现自己的MockServerHandler
并将其传递给MockServer
:
val customHandler = object : MockServerHandler {override fun handle(request: MockRequest): MockResponse {return if (/* Your custom logic here */) {MockResponse(body = """{"data": {"random": 42}}""",headers = mapOf("X-Test" to "true"),)} else {MockResponse(body = "Internal server error",statusCode = 500,)}}}val mockServer = MockServer(customHandler)
注意,如果你使用自定义的MockServerHandler
,则无法调用MockServer.enqueue()
,因为它期望处理程序是QueueMockServerHandler
。