模拟HTTP响应(实验性)
MockServer
仍然是实验性的,大部分 API 都是针对 Kotlin 设计的。MockServer
是跨平台的,但如果您只使用 Java,我们建议使用OkHttp MockWebServer它将提供惯用的 Java API。
MockServer
实现了一个 HTTP 服务器,您可以使用它来模拟响应。这对于测试特定的服务器行为非常有用,例如错误情况、HTTP 标头和超时。使用它需要对生产代码进行最小修改,因为您只需要更改您的serverUrl
。
ⓘ 注意
.css-154yii{-webkit-text-decoration:underline;text-decoration:underline;text-decoration-style:dotted;text-decoration-thickness:1.5px;text-decoration-color:var(--chakra-colors-gray-300);text-underline-offset:0.2em;}.css-154yii:hover,.css-154yii[data-hover]{cursor:help;}.chakra-ui-dark .css-154yii:not([data-theme]),[data-theme=dark] .css-154yii:not([data-theme]),.css-154yii[data-theme=dark]{text-decoration-color:var(--chakra-colors-blue-400);}Apollo KotlinMockServer 是在一个单独的仓库中开发的。前往
将依赖项添加到你的 build.gradle
文件中:
dependencies {testImplementation("com.apollographql.mockserver:apollo-mockserver:0.0.1")}
以下是如何使用的示例
// Create a mock serverval mockServer = MockServer()// Provide its URL to your ApolloClientval apolloClient = ApolloClient.Builder().serverUrl(mockServer.url()).store(store).build()// Enqueue HTTP responsesmockServer.enqueueString("""{"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
。