出于测试目的,是否可以拥有"进程内"Tomcat实例?

Adr*_*scu 9 java testing junit tomcat maven

我有一个基于Maven的Web应用程序项目,它生成一个在Tomcat中运行的WAR.让我们假设,为了论证,对于该项目的单元测试来说,通过网络实际发送/接收请求是非常重要的(而不是简单地使用模拟请求调用servlet方法).

我的测试工具是否有办法在同一个JVM中运行Tomcat实例,加载当前项目,并让测试用例点击它localhost?如果做不到这一点,我将如何以编程方式将当前项目(以及依赖项)打包到WAR中,以便我可以使用Cargo以编程方式将其上载到其他Tomcat实例中?有没有更好的选择,而不仅仅是炮轰mvn

我知道我的请求很不寻常,单元测试应该更加独立,等等,但请让我们一起玩:)

Aru*_*hny 7

您可以使用嵌入式Tomcat来实现此目的.只需在测试工具中设置静态实例,并在最后将其关闭.这是一些示例代码:

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.junit.AfterClass;
import org.junit.BeforeClass;

public class TomcatIntegrationTest {
  private static Tomcat t;
  private static final int TOMCAT_PORT = 9999;

  @BeforeClass
  public static void setUp() throws LifecycleException {
    t = new Tomcat();
    t.setBaseDir(".");
    t.setPort(TOMCAT_PORT);
    /* There needs to be a symlink to the current dir named 'webapps' */
    t.addWebapp("/service", "src/main/webapp"); 
    t.init();
    t.start();
  }

  @AfterClass
  public static void shutDownTomcat() throws LifecycleException {
    t.stop();
  }
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 6

Jetty非常适合这个目的.如果你没有被迫拥有Tomcat,你可以在集成测试阶段很容易地使用它.有预集成启动jetty,后集成停止它,你可以在war文件中抛出请求,因为它在一个实际的容器中运行.