还是因为公司的近期的一个项目,后台开发的rest service,该如何测试呢?当然,我们的rest service最终是部署到tomcat里的,所以,一般来说,可以把项目打包后扔到tomcat中跑起来,再通过页面或者客户端代码来调用测试。
这里介绍另一个方法,利用“内存中的容器”来调试,就是我们不用打包并扔到tomcat中,自己在IDE中,用Unit Test的方法来测试。
1. Jersey的测试框架支持的容器很多,这里选用了常用的grizzly2
在项目的pom.xml中,引入依赖:
<dependency> <groupId>org.glassfish.jersey.test-framework</groupId> <artifactId>jersey-test-framework-core</artifactId> <version>${jersey.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.glassfish.jersey.test-framework.providers</groupId> <artifactId>jersey-test-framework-provider-grizzly2</artifactId> <version>${jersey.version}</version> <scope>test</scope> </dependency>
2. 写Jersey的Resource文件
@Path("my/jersey") public class TestResource{ @Autowired protected SystemManager systemManager; //这由spring注入 @GET @Path("/test") public String test(@QueryParam("systemId") Integer systemId) { return "test"; } }
3. 书写SystemManager和SystemManagerImpl
略
4. 把manager配置到Spring Application.xml中
略
5. 书写Jersey Application
@Path("webapi") public class TestApplication extends ResourceConfig { public TestApplication(){ register(RequestContextFilter.class); register(TestResource.class); } }
6. 书写Unit Test文件
public class MyRestTest extends JerseyTest { @Override protected Application configure() { ResourceConfig rc = new MyApplication() .register(SpringLifecycleListener.class) .register(RequestContextFilter.class); enable(TestProperties.LOG_TRAFFIC); enable(TestProperties.DUMP_ENTITY); return configure(rc); } @Override protected ResourceConfig configure(ResourceConfig rc) { rc.property("contextConfigLocation", "spring.xml"); return rc; } @Test public void test(){ final String hello = target("my/jersey/test") .queryParam("systemId", 1) .request() .get(String.class); System.out.println("==========\n" + hello); } }
7. 运行test(),即可看到结果。
这样测试时,如果有问题,比较难定位问题(比如,少了个参数),通常只是打印出500的状态码,没有其他更详细的错误信息(我已经把日志级别设置到最低了)。
虽然如此,用这个方法初步测试下自己的rest service还是很方便的。