Чтобы запустить службу, я знаю, что используется new MyService().run(args)
. Как остановить его?
Мне нужно начинать и останавливаться программно для setUp()
и tearDown()
в моих тестах.
Чтобы запустить службу, я знаю, что используется new MyService().run(args)
. Как остановить его?
Мне нужно начинать и останавливаться программно для setUp()
и tearDown()
в моих тестах.
Вы можете запустить службу в новом потоке, как только тест завершится, служба автоматически отключится.
Однако, начиная с dropwizard 0.6.2, модуль тестирования dropwizard содержит правило junit именно для этого варианта использования (см. здесь).
Использование этого правила будет выглядеть примерно так:
Class MyTest {
@ClassRule
public static TestRule testRule = new DropwizardServiceRule<MyConfiguration>(MyService.class,
Resources.getResource("service.yml").getPath()));
@Test
public void someTest(){
....
Сохраните переменную environment
и добавьте в приложение следующий метод:
public void stop() throws Exception {
environment.getApplicationContext().getServer().stop();
}
Теперь вы можете вызвать myService.stop()
, чтобы остановить сервер.
Спасибо @LiorH за это замечательное предложение.
Вот полный тестовый класс с помощью DropwizardServiceRule в dropwizard-0.6.2.
Сначала создайте конфигурацию службы для тестирования: 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;
В конце тестов сервер будет изящно выключен, поэтому вам не нужно беспокоиться об этом.
вы можете попробовать использовать метод stop() для org.eclipse.jetty.server.Server, который внутренне используется Dropwizard.
Или вы используете эту функцию 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));
}
});