2013-03-04 129 views
0

我使用Apache Wink 1.2.1。我想單元測試我的REST服務,我寧願不使用RestClient。我還沒有找到任何例子,但經過大量搜索後,我猜想MockServletInvocationTest是正確的起點......但是我一直無法使它工作。使用MockServletInvocationTest測試Apache Wink REST服務單元測試

這是一個最小的例子,我失敗了。

我的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; at org.apache.wink.server.internal.handlers.FlushResultHandler$FlushHeadersOutputStream.flushHeaders(FlushResultHandler.java:350) ~[wink-server-1.2.1-incubating.jar:1.2.1-incubating]

回答

2

,我發現我的問題是什麼,我只留下一張紙條在這裏如果有人有同樣的問題。

這是爲什麼我得到了NoSuchMethodError

  • 我用Apache Maven處理依賴
  • 使用MockHttpServletRequestMockHttpServletResponse我包括依賴春天,模擬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-ap我2.3,其中javax/servlet/http/HttpServletResponse.getContentType()Ljava/lang/String不存在!該方法由於servlet的API存在2.4

因此,要解決我的問題,我只是增加了一個顯式依賴於Servlet的API 2.4範圍測試!現在我的單元測試沒有問題!

+0

你是怎麼弄出依賴錯誤的? 'maven樹'? – 2014-06-29 09:31:50

+0

@bubuzzz:我真的不記得我是怎麼想出來的......我猜是因爲我很絕望,而且我開始瀏覽所有的Maven依賴關係樹。 – MarcoS 2014-06-30 10:53:21