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

时间:2017-12-13 13:52:52

标签: java junit wiremock

我们的情景: -

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

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

问题: -

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

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

var clickHandler = function() {

  document.getElementById('dropbtn').innerHTML = current.innerHTML;

};

var dropdown = document.getElementById('dropdown');
var filterItem = dropdown.getElementsByTagName('LI')

for (var i = 0; i < filterItem.length; i++) {
  var current = filterItem[i];
  current.addEventListener('click', clickHandler, false);

}

- &GT;问题是,当一些额外的参数被添加到模块中的上述URL时,它自然会变成无效的URL并抛出异常。如果我们将模块注释的一部分添加到这些额外参数中,我们可以从我们的测试项目中成功运行模块。 (只有一行通信)

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

WireMock技术在这里有用吗?我读了一下它并且不确定它是否对这种情况有用,因为这里是要在Test下模拟的内部URL。

1 个答案:

答案 0 :(得分:0)

是的,使用Wiremock,您可以设置一个存根服务器,该服务器使用您要为模块提供的xml进行响应。因此,对于测试,您将设置

InputFileUrl = http://<wiremockurl>

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

Stubbing然后就像这样:

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

正如您可以在wiremock documentation中阅读的那样,您可以为许多其他查询参数返回相同的响应,也可以为特定的其他查询参数设置特定的响应。

// 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参数。