Aby uruchomić usługę, wiem, że używa się new MyService().run(args)
. Jak to zatrzymać?Dropwizard: Jak zatrzymać programowo programowo
Potrzebuję rozpocząć i zatrzymać programowo dla setUp()
i tearDown()
w moich testach.
Aby uruchomić usługę, wiem, że używa się new MyService().run(args)
. Jak to zatrzymać?Dropwizard: Jak zatrzymać programowo programowo
Potrzebuję rozpocząć i zatrzymać programowo dla setUp()
i tearDown()
w moich testach.
możesz spróbować użyć metody stop() org.eclipse.jetty.server.Server, która jest wewnętrznie używana przez Dropwizard.
Usługę można uruchomić w nowym wątku, po zakończeniu testu usługa automatycznie się wyłączy.
Jednak uruchamianie w dropwizard 0.6.2 moduł testujący dropwizard zawiera junit rule dokładnie dla tego przypadku użycia (see here).
Zastosowanie tej zasady będzie wyglądać mniej więcej tak:
Class MyTest {
@ClassRule
public static TestRule testRule = new DropwizardServiceRule<MyConfiguration>(MyService.class,
Resources.getResource("service.yml").getPath()));
@Test
public void someTest(){
....
Dlaczego nie udokumentowali tej klasy? (retoryczne) Jak się o tym dowiedziałeś @LiorH? (nie retoryczne) – DavidS
tak, to dziwne, że nie jest udokumentowane, mam nadzieję, że nie zostanie usunięte. Ktoś w pracy wskazał mi tę klasę, nie wiem, jak ją znalazł. – LiorH
Witam @LiorH - miło cię tu widzieć! Bardzo pomocne;) – Galz
Thanks @LiorH dla tego wielkiego sugestię.
Oto pełna klasa testowa wykorzystująca DropwizardServiceRule w dropwizard-0.6.2.
Najpierw utwórz konfigurację usługi do testowania: testing-server.yml
i umieść ją w ścieżce klasy testu (np. src\test\resources
). W ten sposób można ustawić różne porty dla usługi testu użyć:
http:
port: 7000
adminPort: 7001
Prosta klasa test, który sprawdza, czy istnieje zasób w miejscu „/ żądanie” wygląda następująco:
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));
}
}
Dodałem również import, jeśli nie wiesz, jaką implementację wybrać.
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;
Po zakończeniu testów serwer zostanie zamknięty z rozwagą, więc nie musisz się tym martwić.
Albo użyć tej funkcji w java/głównego konstruktora ...:
// 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));
}
});
Przechowywać zmienną environment
się i dodaj następującą metodę aplikacji:
public void stop() throws Exception {
environment.getApplicationContext().getServer().stop();
}
Teraz możesz zadzwoń pod numer myService.stop()
, aby zatrzymać serwer.
Znalazłem to bardzo przydatne, aby zatrzymać aplikację DW, jeśli działa jako usługa Windows (na przykład za pomocą Apache Commons Daemon). –
Czy możesz wskazać mi przykładowy kod? Nie rozumiem, jak sobie z tym poradzić. – Neo