J'essaie d'écrire un test d'intégration pour faire tourner localement le serveur de la jetée, puis j'utilise le client pour communiquer avec l'URI restant et appeler la logique métier en aval. Cependant, lorsque je démarre mon serveur de jetée, il ne renonce pas au contrôle, mon client n'est donc pas exécuté. J'ai donc utilisé le thread pour démarrer ma jetée dans un autre thread, cependant, le thread se termine avant mon appel client, il est dit que la connexion a été refusée. Toute approche que je peux adopter?
@Test
public void testPerform() {
final JettyServer jettyServer = JettyServer.create();
jettyServer.buildJettyServer(ServletContextHandler.SESSIONS, "/", 8080, TestResource.class);
Runnable runnable = new Runnable()
{
@Override
public void run()
{
jettyServer.start();
}
};
new Thread(runnable).start();
final javax.ws.rs.client.Client client = ClientBuilder.newClient();
final Response response = client.target("http://localhost:8080/test").request().post(Entity.text(""));
jettyServer.stop();
}
Ignorez la Runnable
, ignorez la new Thread(runnable).start()
L'appel jettyServer.start()
démarre le serveur sur son propre thread (ainsi que tous les autres threads dont le serveur a besoin.
Pour un exemple de base de junit et de jetée ...
@Test
public void testGet() throws Exception
{
// Create Server
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
defaultServ.setInitParameter("resourceBase",System.getProperty("user.dir"));
defaultServ.setInitParameter("dirAllowed","true");
context.addServlet(defaultServ,"/");
server.setHandler(context);
// Start Server
server.start();
// Test GET
HttpURLConnection http = (HttpURLConnection)new URL("http://localhost:8080/").openConnection();
http.connect();
assertThat("Response Code", http.getResponseCode(), is(HttpStatus.OK_200));
// Stop Server
server.stop();
}
Le @Before
et @After
les annotations junit peuvent également être utilisées. Cela démarrera le serveur avant chaque @Test
et arrêtez le serveur après.
package jetty;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import Java.net.HttpURLConnection;
import Java.net.URL;
import org.Eclipse.jetty.http.HttpStatus;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.servlet.DefaultServlet;
import org.Eclipse.jetty.servlet.ServletContextHandler;
import org.Eclipse.jetty.servlet.ServletHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class JUnitBeforeAfterJettyTest
{
private Server server;
@Before
public void startJetty() throws Exception
{
// Create Server
server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
defaultServ.setInitParameter("resourceBase",System.getProperty("user.dir"));
defaultServ.setInitParameter("dirAllowed","true");
context.addServlet(defaultServ,"/");
server.setHandler(context);
// Start Server
server.start();
}
@After
public void stopJetty()
{
try
{
server.stop();
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Test
public void testGet() throws Exception
{
// Test GET
HttpURLConnection http = (HttpURLConnection)new URL("http://localhost:8080/").openConnection();
http.connect();
assertThat("Response Code", http.getResponseCode(), is(HttpStatus.OK_200));
}
}
Pour la meilleure approche, vous pouvez également utiliser le @BeforeClass
et @AfterClass
techniques, ainsi que la liaison automatique à un port ouvert. Cela ne démarrera le serveur qu'une seule fois, par classe de test, exécutera tous les @Test
méthodes, puis arrêtez le serveur une fois à la fin.
package jetty;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import Java.net.HttpURLConnection;
import Java.net.URI;
import Java.net.URL;
import org.Eclipse.jetty.http.HttpStatus;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.server.ServerConnector;
import org.Eclipse.jetty.servlet.DefaultServlet;
import org.Eclipse.jetty.servlet.ServletContextHandler;
import org.Eclipse.jetty.servlet.ServletHolder;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class JUnitBeforeAfterClassJettyTest
{
private static Server server;
private static URI serverUri;
@BeforeClass
public static void startJetty() throws Exception
{
// Create Server
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0); // auto-bind to available port
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler();
ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
defaultServ.setInitParameter("resourceBase",System.getProperty("user.dir"));
defaultServ.setInitParameter("dirAllowed","true");
context.addServlet(defaultServ,"/");
server.setHandler(context);
// Start Server
server.start();
// Determine Base URI for Server
String Host = connector.getHost();
if (Host == null)
{
Host = "localhost";
}
int port = connector.getLocalPort();
serverUri = new URI(String.format("http://%s:%d/",Host,port));
}
@AfterClass
public static void stopJetty()
{
try
{
server.stop();
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Test
public void testGet() throws Exception
{
// Test GET
HttpURLConnection http = (HttpURLConnection) serverUri.resolve("/").toURL().openConnection();
http.connect();
assertThat("Response Code", http.getResponseCode(), is(HttpStatus.OK_200));
}
}