在Junit4上下文中以调试模式编程启动Jetty



我们所有的测试都有一个方法,它启动Jetty Server来发布和测试Web服务:

@Before
public void startJettyAndloadWSDL() throws Exception {
    String port = System.getProperty("jetty.port");
    server = new Server(Integer.valueOf(port));
    WebAppContext webapp = new WebAppContext();
    webapp.setSecurityHandler(getSecurityHandler()); // this is a local function in my test
    webapp.setContextPath("/");
    webapp.setWar(System.getProperty("jetty.war"));
    server.setHandler(webapp);
    // Is there an option somewhere to say "start Jetty in Debug mode"?
    server.start();
    service = new MyServiceToTest(new URL("http://127.0.0.1:" + port + "/WS/MyServiceToTest/1?WSDL"), 
        new QName("urn:myservicetotest.services.mycompany.com/1", "MyService")).getMyServicePort();
}

有没有办法让Jetty在调试模式下启动,以便在Eclipse中设置断点?

测试是在Eclipse外部使用Maven运行的,那么在这种情况下进行远程调试可能更好?我们不想与Eclipse有很大的联系,这就是我们在所有JUnits测试中启动jetty的原因。

我们不能更改嵌入式Jetty,因为持续集成需要它,并且我们不会维护两个版本的JUnit测试(自动或手动)。

我找到的解决方案是:

1-来自maven的远程调试:

使用以下命令(来自maven站点)开始测试:

mvn -Dmaven.surefire.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -Xnoagent -Djava.compiler=NONE" test

然后在8000端口上启动Eclipse远程调试。但这个解决方案不是很聪明:由于jetty是嵌入式的,我必须手动启动Eclipse的远程调试,当我从命令行启动maven时,它需要一些同步(在该项目中,maven没有集成到Eclipse)。

我们最终使用的最佳方式是:

2-来自Eclipse Junit

我只是在调试模式下执行Eclipse的Junit测试,这非常完美:jetty启动方法不需要debug mode的任何选项,因为它是在运行时或调试模式下启动的JVM。

我不需要在Eclipse中使用WTP码头,我只需要在测试中定义如下属性:

${jetty.port} 

断点停在我想要的地方。

唯一的配置是在Eclipse中,它不会更改我们的代码。

通常有两种情况下运行测试:1)作为构建的一部分,以确保新构建不会失败任何测试;2)在开发时,以确保一小部分功能在前进之前正常工作。

我认为这里的问题是,通过让测试启动Jetty,您的环境正试图同时处理这两种情况,我不确定这是否可能。

我认为您需要从测试代码中删除jetty启动,为了处理上下文#1,让maven在预集成测试阶段启动jetty,并在集成测试阶段运行需要jetty的测试。这是运行需要web服务器的测试的一种非常常见的方式。

当在上下文#2中操作时,在调试模式下在Eclipse中启动嵌入式Jetty,然后从Eclipse而不是Maven运行测试。

最新更新