在 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 参数。
场景我们有:-
我们有一个模块(在 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 参数。