brainbaking/content/wiki/code/java/testing/stubs.md

3.1 KiB

+++ title = "stubs" draft = false tags = [ "code", "java", "testing", "stubs" ] date = "2013-03-12" +++

Stubs

Embedded Jetty

Zie http://docs.codehaus.org/display/JETTY/Embedding+Jetty

Stub Http server:

public class StubHttpServer implements StubServer {

	private RequestRecordingFilter filter = new RequestRecordingFilter();

	private int port;

	private Server httpServer;

	private Map<String, ResettableHttpServlet> servlets = new HashMap<String, ResettableHttpServlet>();

	public StubHttpServer(int port) {
		this.port = port;
	}

	public void addHttpServlet(String uri, final HttpServlet servlet) {
		addHttpServlet(uri, new ResettableHttpServlet() {

			@Override
			public void reset() {
			}

			@Override
			public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
				servlet.service(req, res);
			}

		});
	}

	public void addHttpServlet(String uri, ResettableHttpServlet servlet) {
		this.servlets.put(uri, servlet);
	}

	public boolean hasReceivedRequest(String method, String uri) {
		return filter.hasReceivedRequest(method, uri);
	}

	public boolean hasMatchingRequest(String method, String uriRegex) {
		return filter.hasMatchingRequest(method, uriRegex);
	}

	public void reset() {
		filter.reset();
		for (ResettableHttpServlet servlet : servlets.values()) {
			servlet.reset();
		}
	}

	public void start() throws Exception {
		if (httpServer ###### null) {
			httpServer = new Server();
			SocketConnector connector = new SocketConnector();
			connector.setPort(port);
			httpServer.setConnectors(new Connector[] { connector });
			Context root = new Context(httpServer, "/", Context.SESSIONS);
			root.addFilter(new FilterHolder(filter), "/*", 0);
			for (String servletMapping : servlets.keySet()) {
				root.addServlet(new ServletHolder(servlets.get(servletMapping)), servletMapping);
			}
			httpServer.start();

			Runtime.getRuntime().addShutdownHook(new Thread() {

				@Override
				public void run() {
					StubHttpServer.this.stop();
				}
			});
		}
	}

	public void stop() {
		if (httpServer != null) {
			try {
				httpServer.stop();
			} catch (Exception e) {
				// ignore
			} finally {
				httpServer = null;
			}
		}
	}

	@Override
	public void startGooiExceptionIndienPoortNogNietVrij() throws Exception {
		start();
	}

}

Concreet voorbeeld:

@StubServer(port = OEStubServer.PORT)
public class OEStubServer extends be.test.stubserver.StubHttpServer {

	public static final int PORT = 9106;

	private static OEStubServer INSTANCE;

	public synchronized static OEStubServer getInstance() {
		if (INSTANCE ###### null) {
			INSTANCE = new OEStubServer();
		}
		return INSTANCE;
	}

	private OeClientAwareServlet oeClientAwareServlet = new OeClientAwareServlet();

	private OEStubServer() {
		super(PORT);
		addHttpServlet("/*", oeClientAwareServlet);
	}

}

De annotatie @StubServer is louter ter informatie. Het belangrijkste is addHttpServlet() van de javax.servlet.http.HttpServlet klasse (hier leidt OeClientAwareServlet van af). Dan wordt doGet of doPost ook geïmplementeerd. That's it!