我使用Apache Wink 1.2.1。我想对我的REST服务进行单元测试,而我宁愿不使用RestClient进行测试。我没有找到任何例子,但经过大量的搜索,我猜到MockServletInvocationTest是正确的起点...但是我无法使其发挥作用。
这是一个失败的最小例子。
我的REST服务:
@Path("greetings")
public class GreetingsResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello World!";
}
}
相应的单元测试:
public class GreetingsResourceTest extends MockServletInvocationTest {
@Override
protected Class<?>[] getClasses() {
return new Class<?>[] { GreetingsResource.class };
}
public void testHello() throws ServletException, IOException {
MockHttpServletRequest request = MockRequestConstructor.
constructMockRequest("GET", "/greetings", MediaType.TEXT_PLAIN);
MockHttpServletResponse response = invoke(request);
assertEquals(200, response.getStatus());
}
}
所以,我有几个问题:
我的方向是错误的吗?
如果我朝着正确的方向前进,那么我做错了什么?执行上一个测试用例时,我收到以下错误(我真的不明白):
java.lang.NoSuchMethodError: 的javax / servlet的/ HTTP / HttpServletResponse.getContentType()Ljava /郎/字符串; 在 org.apache.wink.server.internal.handlers.FlushResultHandler $ FlushHeadersOutputStream.flushHeaders(FlushResultHandler.java:350) 〜[眨眼服务器1.2.1- incubating.jar:1.2.1-温育]
答案 0 :(得分:3)
我发现我的问题是什么,我只是留下一个注释,以防有人遇到同样的问题。
这就是我得到NoSuchMethodError
:
使用MockHttpServletRequest
和MockHttpServletResponse
我在spring-mock 2.0.8中包含了一个依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>2.0.8</version>
<scope>test</scope>
</dependency>
遗憾的是,spring-mock 2.0.8依赖于commons-logging 1.1,而后者依赖于servlet-api 2.3,其中javax/servlet/http/HttpServletResponse.getContentType()Ljava/lang/String
不存在!自servlet-api 2.4
所以,为了解决我的问题,我只是通过范围测试向servlet-api 2.4添加了一个显式依赖项!现在我的单元测试没有问题!