Spark Web框架单元测试

Mr *_*rms 7 java junit unit-testing spark-java

我正在使用Spark Web框架并创建RESTful API.(http://sparkjava.com因为有很多东西叫做"Spark")

我的雇主的标准要求我们编写一系列单元测试,每天自动运行一次,以确认应用程序仍在运行.

Spark很容易使用像Postman这样的工具来测试自己,但是我没有找到任何JUnit使用Spark编写测试的好例子,甚至没有使用它以编程方式编写HTTP请求.

有没有人这样做过?可能吗?

Fer*_*zyn 9

我们开发了一个小型库,便于Spark控制器/端点的单元测试.

Github上

此外,版本1.1.3发布在Maven Central Repository中

<dependency>
        <groupId>com.despegar</groupId>
        <artifactId>spark-test</artifactId>
        <version>1.1.3</version>
        <scope>test</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)


Fer*_*zyn 5

我有同样的要求,你和我找到了让它运作的方法.我搜索了Spark源代码,发现了两个有用的类:

  • SparkTestUtil:此类包装Apache HttpClient并公开方法,以使用可自定义的端口(在构造函数中)和相对路径(在请求方法中)对本地Web服务器(在localhost中运行)发出不同的http请求
  • ServletTest:它在本地端口中启动Jetty实例,其中包含应用程序上下文和相对目录路径,可以在其中找到WEB-INF/web.xml文件描述符.此web.xml将用于模拟Web应用程序.然后,它使用SparkTestUtil对此模拟应用程序发出http请求并声明结果.

这就是我所做的:我创建了一个实现SparkApplication接口的junit测试类.在该接口中,我创建并初始化负责回答http请求的"控制器"(我的应用程序类).在使用@BeforeClass注释的方法中,我使用web.xml初始化Jetty实例,该文件将junit测试类称为SparkApplication和SparkTestUtil

JUnit测试类

package com.test

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.webapp.WebAppContext;

public class ControllerTest implements SparkApplication {

    private static SparkTestUtil sparkTestUtil;

    private static Server webServer;

    @Override
    public void init() {
         new Controller(...)
    }

    @BeforeClass
    public static void beforeClass() throws Exception {
       sparkTestUtil = new SparkTestUtil(PORT);
       webServer = new Server();
       ServerConnector connector = new ServerConnector(webServer);
       connector.setPort(PORT);
       webServer.setConnectors(new Connector[] {connector});
       WebAppContext bb = new WebAppContext();
       bb.setServer(webServer);
       bb.setContextPath("/");
       bb.setWar("src/test/webapp/");
       webServer.setHandler(bb);
       webServer.start();
       (...)
    }

    @AfterClass
    public static void afterClass() throws Exception {
       webServer.stop();
       (...)
    }    

}
Run Code Online (Sandbox Code Playgroud)

src/test/webapp/WEB-INF/web.xml文件

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <filter>
        <filter-name>SparkFilter</filter-name>
        <filter-class>spark.servlet.SparkFilter</filter-class>
        <init-param>
            <param-name>applicationClass</param-name>
            <param-value>com.test.ControllerTest</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SparkFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)

这可以改进,但我认为这是一个很好的起点.也许可以创建一些"火花测试"组件?

希望这对你有用!