我们的所有测试都有一个启动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的原因。
答案 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运行测试。