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

时间:2012-03-21 14:25:25

标签: maven junit 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的原因。

2 个答案:

答案 0 :(得分:2)

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

我找到的解决方案是:

1 - 来自maven with remote debug:

使用以下命令(来自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,我只需要在测试中定义属性,如:

${jetty.port} 

断点停在我想要的地方。

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

答案 1 :(得分:1)

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

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

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

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