Jetty gradle集成测试

Jetty gradle集成测试,jetty,gradle,integration-testing,Jetty,Gradle,Integration Testing,我是gradle工具的新手,我正在尝试使用gradle中的jetty插件添加对运行集成测试的支持。 我遇到了两篇文章,但我的方法的不同之处在于,我没有使用单独的源代码集进行集成测试。我的集成测试是按照这个模式命名的 “**/ITCase**” 我的项目有4个子模块,我正在为服务模块设置集成测试。使用该示例,我设置了jetty配置: [jettyRun, jettyStop]*.stopPort = 8006 [jettyRun,jettyStop]*.stopKey = 'STOP' jetty

我是gradle工具的新手,我正在尝试使用gradle中的jetty插件添加对运行集成测试的支持。 我遇到了两篇文章,但我的方法的不同之处在于,我没有使用单独的源代码集进行集成测试。我的集成测试是按照这个模式命名的

“**/ITCase**”

我的项目有4个子模块,我正在为服务模块设置集成测试。使用该示例,我设置了jetty配置:

[jettyRun, jettyStop]*.stopPort = 8006
[jettyRun,jettyStop]*.stopKey = 'STOP'
jettyRun {
   classpath=configurations.compile
}

task integrationTest(type: Test, dependsOn: "test" ) {
include '**/*ITCase*.*'
println 'Starting the embedded jetty'
doFirst {
    jettyRun.daemon = true
    jettyRun.scanIntervalSeconds = 0
    jettyRun.execute()
}
doLast {
    jettyStop.execute()
    println 'Stopping the embedded jetty'
}
}

“测试”是在父项目的build.gradle中定义的任务

当我运行命令gradlewarintegrationtest时,集成测试失败,因为它在服务项目中找不到上下文侦听器。 错误消息的一个片段如下所示:

:services:integrationTest (Thread[Daemon Thread 14,5,main]) started.
:services:integrationTest
Executing task ':services:integrationTest' (up-to-date check took 0.026 secs) due to:
  No history is available.
Starting the embedded jetty
Executing task ':services:jettyRun' (up-to-date check took 0.0 secs) due to:
  Task has not declared any outputs.
Configuring Jetty for project ':services'
Webapp source directory = E:\Workspace\project\services\src\main\webapp
Reload Mechanic: automatic
web.xml file = E:\Workspace\project\services\src\main\webapp\WEB-INF\web.xml
Context path = /services
Tmp directory =  determined at runtime
Web defaults = org/mortbay/jetty/webapp/webdefault.xml
Web overrides =  none
Webapp directory = E:\Workspace\project\services\src\main\webapp
Starting jetty 6.1.25 ...
jetty-6.1.25
Could not instantiate listener com.db.project.services.ProjectServletContextListener
java.lang.ClassNotFoundException: com.db.project.services.ProjectServletContextListener
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:401)
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
    at org.mortbay.jetty.handler.ContextHandler.loadClass(ContextHandler.java:1101)
    at org.mortbay.jetty.webapp.WebXmlConfiguration.initListener(WebXmlConfiguration.java:630)
    at org.mortbay.jetty.webapp.WebXmlConfiguration.initWebXmlElement(WebXmlConfiguration.java:368)
    at org.mortbay.jetty.plus.webapp.AbstractConfiguration.initWebXmlElement(AbstractConfiguration.java:190)
    at org.mortbay.jetty.webapp.WebXmlConfiguration.initialize(WebXmlConfiguration.java:289)
在此方面的任何帮助都将不胜感激。
提前感谢

我认为错误消息的根本原因是,jetty任务的类路径不包含项目生产代码,而只包含其编译类路径。要使其正常工作,从代码段中删除类路径配置应该可以做到这一点。jetty插件已经为您做到了这一点

另一个旁注:通常,通过运行“task.execute”来执行任务被认为是不好的做法。相反,您应该使用Task#dependsOn&Task#finalizedBy。想象一下你的一个测试失败了。然后,doLast块永远不会执行,码头也永远不会停止

干杯,
勒内

谢谢勒内,现在我再也看不到那个错误了。但是看起来它仍然无法定位战争,所有的集成测试都返回404错误。是否有其他配置将其指向war?是否可以在启用信息日志记录的情况下运行构建并手动检查是否可以访问您的webapp?干杯,我在码头启动后注意到一条错误消息:“失败ContextHandlerCollection@5d3b9a4e:java.lang.NoClassDefFoundError:com/sun/jersey/spi/container/WebApplication失败HandlerCollection@6766b0f5:java.lang.NoClassDefFoundError:com/sun/jersey/spi/container/WebApplication“,我的依赖项块中确实有所有jersey依赖项,但jetty无法找到这些依赖项,我认为这就是测试失败的原因。能否发布build.gradle文件的依赖项块,并再次检查war是否包含NoClassDefFoundError中列出的类?缺少的类(com/sun/jersey/spi/container/WebApplication)在一个包jersey server中,这是com.sun.jersey:jersey servlet:1.17.1的可传递依赖项之一,gradle没有引入这个包的可传递依赖项,这就是我看到该错误的原因。