0

我使用 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. 如果我朝着正确的方向前进,那我做错了什么?在执行上一个测试用例时,我收到以下错误(我真的不明白):

java.lang.NoSuchMethodError: javax/servlet/http/HttpServletResponse.getContentType()Ljava/lang/String; 在 org.apache.wink.server.internal.handlers.FlushResultHandler$FlushHeadersOutputStream.flushHeaders(FlushResultHandler.java:350) ~[wink-server-1.2.1-incubating.jar:1.2.1-incubating]

4

1 回答 1

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 开始存在

So, to solve my problem I simply added an explicit dependency to servlet-api 2.4 with scope test! Now my unit test works without a problem!

于 2013-03-06T16:57:25.920 回答