集成测试期间托管网站

时间:2017-07-15 22:27:05

标签: java spring spring-mvc spring-boot integration-testing

我正在使用一个刮刀,我试图编写一个集成测试,用于扫描存储在磁盘上的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应用程序。

1 个答案:

答案 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,只需要做几件事:

  1. 使用@Rule指定WireMockRule(它处理正在运行的HTTP服务器)。值得一提的是 - 使用未使用的端口号,否则服务器无法启动。
  2. @Before阶段的存根服务器行为(您可以在此处找到有关存根的更多信息 - http://wiremock.org/docs/stubbing/
  3. 准备连接到正在运行的服务器的测试用例(在localhost上)。
  4. 您不必担心关闭HTTP服务器 - 在运行测试完成后它将关闭。
  5. 我故意粘贴了所有导入,因此您可以查看使用了哪些类。

    希望有所帮助:)