2

我有一个应用程序,当执行 main 方法时,它会启动一个 Web 服务器来托管一些 RESTful 服务(使用Dropwizard)。我正在尝试编写访问 HTTP 方法(而不是 Java 方法)的测试,因此测试具有服务器正在运行的先决条件。

这是我执行应用程序并启动 Web 服务器的任务:

task run (dependsOn: 'classes', type: JavaExec) {
    main = 'com.some.package.to.SomeService'
    classpath = sourceSets.main.runtimeClasspath
    args 'server', 'some.yml'
}

服务器也需要几秒钟才能启动。粗略地说,我想做的是这样的:

test.doFirst {
    println "Starting application..."
    Thread.startDaemon {
        // What goes here???
    }
    sleep 20000
    println "Application should be started."
}

换句话说,在运行测试之前,在单独的线程中启动应用程序并在运行测试之前等待一段时间,让它有时间完成启动。

也就是说,我无法弄清楚 Thread.startDaemon 中发生了什么(tasks.run.execute()不起作用),也无法弄清楚这是否是最好的方法。解决这个问题的最佳方法是什么?

谢谢!

4

1 回答 1

1

我可能会做的是这样的:

task startServer (type: Exec) {
    workingDir 'tomcat/bin'
    // using START hopefully forks the process
    commandLine 'START', 'start.bat'
    standardOutput = new ByteArrayOutputStream()
    ext.output = {
      return standardOutput.toString()
    }
    // loop through output stream for finished flag
    // or just put a timeout here
}

task testIt (type: Test) {
    description "To test it."
    include 'org/foo/Test*.*'
}

然后,在调用 Gradle 目标时,调用 "gradle.bat startServer testIt" 。这就是基本思想。

于 2013-05-22T23:37:05.673 回答