我正在使用一个刮刀,我试图编写一个集成测试,用于扫描存储在磁盘上的HTML。测试应该从img src中抓取图像网址。在代码中,这归结为Jsoup.connect(url)
,其中url是一个String。我知道嘲笑,但这并不属于集成测试。这就是我认为托管网站的原因,并且真正返回图像是要走的路。当然欢迎其他选择。
理想情况下,小型Web服务器在测试运行时启动。我应该能够确定或至少知道它发布网站的网址。我还应该能够将Web服务器指向HTML文件。
刮刀项目是一个Spring Boot。我可以静态地为页面提供服务,例如来自/ static,而不是由控制器解决。当我有一个控制器返回页面时,它被Thymeleaf解决并抛出org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference
。要查看这些结果,我运行整个Spring Boot应用程序。
答案 0 :(得分:2)
考虑在您的案例中使用 WireMock (http://wiremock.org/)。 WireMock可帮助您运行HTTP服务器并在集成(或单元)测试环境中存根其行为。看一下下面的例子(JUnit测试):
package com.github.wololock;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
public final class WireMockHtmlTest {
@Rule
public WireMockRule wireMockRule = new WireMockRule(options().port(8080));
@Before
public void setup() throws IOException {
final InputStream inputStream = getClass().getClassLoader().getResourceAsStream("html/index.html");
final String html = new String(IOUtils.toByteArray(inputStream), Charset.forName("UTF-8"));
wireMockRule.stubFor(get(urlEqualTo("/index"))
.willReturn(aResponse()
.withBody(html)
.withHeader("Content-Type", "text/html; charset=UTF-8")
)
);
}
@Test
public void test() throws IOException, InterruptedException {
//given:
final URLConnection connection = new URL("http://localhost:8080/index").openConnection();
//when:
final String body = IOUtils.toString(connection.getInputStream(), Charset.forName("UTF-8"));
//then:
assertThat(body.contains("Hello world!"), is(equalTo(true)));
}
}
此测试加载存储在src/test/resources/html/index.html
中的HTML文件的内容,此文件包含:
<html>
<head>
<title>Hello world!</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>
如果要在集成测试中使用WireMock,只需要做几件事:
@Rule
指定WireMockRule
(它处理正在运行的HTTP服务器)。值得一提的是 - 使用未使用的端口号,否则服务器无法启动。@Before
阶段的存根服务器行为(您可以在此处找到有关存根的更多信息 - http://wiremock.org/docs/stubbing/)localhost
上)。我故意粘贴了所有导入,因此您可以查看使用了哪些类。
希望有所帮助:)