在 junit 测试中通过 URL 提供存根文件 - wiremock

Providing stubbed files via URLs in junit tests - wiremock

场景我们有:-

我们有一个模块(在 java 中)可以使用 Junit 进行测试。该模块基本上将文件作为输入,对其进行处理,然后将数据写入 Hazelcast。这些输入文件是从内部 URL 下载的。

在我们的 Junit 测试中(完全是一个单独的测试项目,即 junit 测试不驻留在要测试的模块中),我们无权访问这些文件所在的 URL居住.

问题:-

-> 为了向模块提供输入文件,使用了 .properties 文件,其中指定了它的物理位置。这是模块本身的 InputFileUrl 字段。

-> 在模块的某处,这个 Url 将被读取(从 .properties 文件)然后一些额外的参数将被添加到它。然后模块尝试将其称为 Url 并下载输入文件。从测试项目我们无法访问此 URL。所以我们为这些输入文件提供以下文件的静态地址:

InputFileUrl = file:///C:/Inputs/file.xml

-> 问题是,当 Module 中的 URL 上面添加了一些额外的参数时,它自然会变得无效 URL 并抛出异常。如果我们在模块注释中添加这些额外参数,我们就可以成功 运行 来自我们测试项目的模块。 (只有一行通讯)

所以 1) 我们如何在不更改模块代码本身的情况下解决这个 URL 访问问题?

WireMock 技术在这里有用吗?我读了一点但不确定它是否对这种情况有用,因为这里内部 URL 被测试模块被模拟。

是的,使用 Wiremock,您可以设置一个存根服务器,该服务器响应您要提供给模块的 xml。所以为了测试你会设置

InputFileUrl = http://<wiremockurl>

wiremockurl 通常是 "localhost",但您可以 运行 使用固定 IP / 域名独立的 wiremock。

存根然后像这样工作:

stubFor(get(urlEqualTo("/api/specific-resource"))
    .willReturn(aResponse()
        .withBody("<xml1>..<xml1>")));

正如您在 wiremock documentation 中看到的那样,您可以 return 对许多其他查询参数使用相同的响应,或者为特定的其他查询参数设置特定的响应。

// responds with same response regardless of query params
.urlEqualTo("/myurl\?.*")

// responds with special xml if additional query param "search_term" is present and matches given regex
.withQueryParam("search_term", matches("^(.*)wiremock([A-Za-z]+)$"))

您可以设置 wiremock 以响应相同或不同的属性,以防模块添加额外的 URL 参数。