我正在尝试对一个类进行单元测试,该类的主要功能是进行 REST 客户端调用。为了调用 REST api,我正在使用 OkHttp3 库。
var apiClient = new OkHttpClient().newBuilder().build();
var request = new Request.Builder()
.url(myApiUrl)
.method("GET", null)
.addHeader("Content-Type", APPLICATION_JSON_VALUE)
.addHeader("x-env", "DEV")
.addHeader("apikey", "API-KEY")
.build();
Google 带我使用 MockServer 框架,这似乎正是我想要的。因此,在我的测试用例中,我设定了以下期望:
mockServerClient.when(
request()
.withMethod("GET").withPath("myApyUrl")
.withHeaders(
header("Content-Type", APPLICATION_JSON_VALUE),
header("x-env", "DEV"),
header("apikey", "API-KEY")
)
).respond(
response()
.withStatusCode(200)
.withContentType(MediaType.APPLICATION_JSON)
.withBody("some response body")
);
当我运行测试时,我失败了,原因是我设置的期望:
method matched
path matched
body matched
headers didn't match
后面跟着一个
no expectation for
,其中包含的标头比我预期的要多得多。在我看来这是正确的,因为我只想测试我明确设置的标头,当然请求将不止于此。
我很确定我正在尝试测试的是一种正常情况,而失败的原因是我“太严格”迫使MockServer测试所有标头而不是我设置/期望的标头。
对 MockServer 非常陌生,我只是尝试用谷歌搜索,但找不到解决我的问题的明确方法。提前感谢您的投入。
如果您知道所有标题键,但不知道值,您可以做的就是简单地忽略该值,如下所示。
// Example of setting up the ClientAndServer to ignore header values
mockServer.when(request()
.withMethod("GET")
.withPath("/path")
.withHeader("x-app-id", "id") // <- exact match
.withHeader("x-api-key", "key") <- exact match
// Ignore value of the two headers below
.withHeader(NottableOptionalString.optional("x-transaktions-id"))
.withHeader(NottableOptionalString.optional("x-request-id")))
.respond(response()
.withBody(someContent)
.withStatusCode(200));
mockServerClient.when(
request()
.withMethod("GET").withPath("myApyUrl")
.withHeaders(
header("(?!Content-Type|x-env|apikey).*", ".*"),
header("Content-Type", APPLICATION_JSON_VALUE),
header("x-env", "DEV"),
header("apikey", "API-KEY")
)
).respond(
response()
.withStatusCode(200)
.withContentType(MediaType.APPLICATION_JSON)
.withBody("some response body")
);
使用 (?!Content-Type|x-env|apikey)
,您将确保它将仅传递为每个标头定义的值,对于任何其他标头,它将传递任何值。