使用MockServletInvocationTest对Apache Wink REST服务进行单元测试

时间:2013-03-04 13:55:48

标签: junit mocking apache-wink

我使用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());
    }

}

所以,我有几个问题:

  1. 我的方向是错误的吗?

  2. 如果我朝着正确的方向前进,那么我做错了什么?执行上一个测试用例时,我收到以下错误(我真的不明白):

  3.   

    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-温育]

1 个答案:

答案 0 :(得分:3)

我发现我的问题是什么,我只是留下一个注释,以防有人遇到同样的问题。

这就是我得到NoSuchMethodError

的原因
  • 我使用Apache Maven来处理依赖项
  • 使用MockHttpServletRequestMockHttpServletResponse我在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添加了一个显式依赖项!现在我的单元测试没有问题!