13

要启动服务,我知道有人使用new MyService().run(args). 如何阻止它?

我需要在我的测试中以编程方式启动setUp()和停止。tearDown()

4

5 回答 5

12

您可以在新线程中启动服务,一旦测试结束,服务将自动关闭。

然而,从 dropwizard 0.6.2 开始,dropwizard-testing 模块包含一个完全适用于这个用例的junit 规则(见这里)。

此规则的用法如下所示:

Class MyTest {

    @ClassRule
    public static TestRule testRule = new DropwizardServiceRule<MyConfiguration>(MyService.class,
                    Resources.getResource("service.yml").getPath()));

    @Test
    public void someTest(){
    ....
于 2013-04-14T19:43:36.420 回答
11

保留environment变量并将以下方法添加到您的应用程序中:

public void stop() throws Exception {
  environment.getApplicationContext().getServer().stop();
}

现在您可以调用myService.stop()以停止服务器。

于 2015-09-22T14:45:57.927 回答
3

感谢@LiorH 的这个好建议。

这是使用dropwizard-0.6.2中的 DropwizardServiceRule 的完整测试类。

首先创建一个用于测试的服务配置:testing-server.yml并将其放在测试的类路径中(例如src\test\resources)。这样,您可以设置不同的端口供测试服务使用:

http:
  port: 7000
  adminPort: 7001

检查“/request”位置是否有资源的简单测试类如下所示:

class TheServiceTest {

    @ClassRule
    public static DropwizardServiceRule RULE = new DropwizardServiceRule<MyConfiguration>(TheService.class,
            Resources.getResource("testing-server.yml").getPath());

    @Test
    public void
    dropwizard_gets_configured_correctly() throws Exception {
        Client client = new Client();

        ClientResponse response = client.resource(
                String.format("http://localhost:%d/request", RULE.getLocalPort()))
                        .get(ClientResponse.class);

        assertThat(response.getStatus(), is(200));
    }
}

如果您不知道选择什么实现,我还添加了导入。

import com.google.common.io.Resources;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.yammer.dropwizard.testing.junit.DropwizardServiceRule;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TestRule;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

在测试结束时,服务器将正常关闭,因此您无需担心。

于 2014-04-04T14:48:56.523 回答
1

您可以尝试使用 Dropwizard 内部使用的 org.eclipse.jetty.server.Server 的 stop() 方法。

于 2013-04-14T17:43:01.817 回答
0

或者你在你的主/构造函数中使用这个java特性......:

    // In case jvm shutdown
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run()
        {
            // what should be closed if forced shudown
            // ....

            LOG.info(String.format("--- End of ShutDownHook (%s) ---", APPLICATION_NAME));
        }
    });
于 2014-10-02T12:40:19.233 回答