MockServer headers 期望太严格了

问题描述 投票:0回答:2

我正在尝试对一个类进行单元测试,该类的主要功能是进行 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 非常陌生,我只是尝试用谷歌搜索,但找不到解决我的问题的明确方法。

提前感谢您的投入。

java okhttp web-api-testing mockserver
2个回答
1
投票
如果我正确理解您的问题,那么您想要模拟给定请求的响应,并且实际请求包含的标头比您设置模拟服务器预期的标头更多。

如果您知道所有标题键,但不知道值,您可以做的就是简单地忽略该值,如下所示。

// 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));
    

0
投票
您可以使用正则表达式来实现:

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)

,您将确保它将仅传递为每个标头定义的值,对于任何其他标头,它将传递任何值。

© www.soinside.com 2019 - 2024. All rights reserved.