我想创建一个嵌入式码头服务器(不是maven,gradle等)来测试spring rest服务。
为此,我创建了EmbeddedServer类。但是不幸的是,其余服务的调用总是导致http 404错误。怎么了?
其余的服务可以与tomcat(未嵌入)一起正常工作。
我使用以下依赖项:
"org.eclipse.jetty:jetty-server:8.1.17.v20150415" "org.eclipse.jetty:jetty-webapp:8.1.17.v20150415"
这是EmbededServer类:
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class EmbeddedServer { private Server server; public void start() throws Exception { this.server = createServer(); this.server.start(); } public void stop() throws Exception { this.server.stop(); this.server.join(); this.server.destroy(); } private Server createServer() { final Server server = new Server(8080); final WebAppContext context = new WebAppContext(); context.setContextPath("/"); context.setResourceBase("src/main/webapp"); context.setDescriptor("src/main/webapp/WEB-INF/web.xml"); context.setParentLoaderPriority(true); context.setServer(server); server.setHandler(context); return server; } }
和测试类:
import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.net.URI; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; public class SimpleTest { private HttpClient client; private EmbeddedServer server; @Before public void before() throws Exception { this.client = new DefaultHttpClient(); this.server = new EmbeddedServer(); this.server.start(); } @After public void after() throws Exception { this.server.stop(); } @Test public void invokeHello() throws Exception { final HttpResponse response = invokeGetRequest("http://localhost:8080/hello"); verifyResponse(response, 200, "hello"); } private HttpResponse invokeGetRequest(final String path) throws Exception { final URI wsAddress = new URI(path); final HttpGet method = new HttpGet(wsAddress); return this.client.execute(method); } private void verifyResponse(final HttpResponse actualHttpResponse, final int expectedHttpCode, final String expectedResponse) throws IOException { assertThat(actualHttpResponse.getStatusLine().getStatusCode(), equalTo(expectedHttpCode)); final String actualResponse = EntityUtils.toString(actualHttpResponse.getEntity(), "UTF-8"); assertThat(actualResponse, equalTo(expectedResponse)); } }
该测试失败并显示:
java.lang.AssertionError: Expected: <200> but: was <404>
ResourceBase和Descriptor的路径必须是绝对路径。
context.setResourceBase("c:/myapp/src/main/webapp"); context.setDescriptor("c:/myapp/src/main/webapp/WEB-INF/web.xml");