2013-03-28 78 views
2

我試圖測試從drowpizard資源返回的視圖是否正確組裝。具體而言,添加用戶的視圖具有一個字段,該字段允許密碼檢查器在未滿足特定規則時拒絕構建用戶的嘗試。該視圖在部署和運行Web應用程序以及指定錯誤密碼時效果很好,但是當我嘗試對其進行單元測試時,它會拋出Web應用程序異常,表明該視圖沒有消息正文編寫器。dropwizard中的單元測試視圖

我的單元測試是非常簡單的:

@Test 
public void testBadPassword(){ 
    ClientResponse response = null; 
    try { 
     response=client().resource("/users").post(ClientResponse.class, createUserParameters); 
     Status status = response.getClientResponseStatus(); 
     assertEquals(Status.SEE_OTHER, status); 
    } finally { 
     if (response != null) { 
      response.close(); 
     } 
    } 
} 

我得到一個服務器的500錯誤,這已經埋下了以下範圍內:

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.seeker.stm.resources.views.AddUserView, and Java type class com.seeker.stm.resources.views.AddUserView, and MIME media type text/html was not found 
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448) 

處理請求和生成視圖的資源和響應看起來像這樣:

@Path("/users") 
public class UserResource { 

    public Object addUser(@FormParam("username") String username, 
     @FormParam("password") String password, 
     @FormParam("email") String email){ 
    Set<String> passwordErrors = passwordChecker.checkValidity(password, username, email); 
    if (!passwordErrors.isEmpty()) {    
     return new AddUserView(userDAO.getAllActive(), passwordErrors); 
    } 

    // ... 
} 

我可以理解的例外(th它所知道的作家,比如StringProvider和ByteArrayProvider,不適用於響應或視圖或其他東西),但我更想知道如何正確地測試可以返回響應代碼或視圖的資源。

回答

4

您需要將addProvider(ViewMessageBodyWriter.class);添加到您的setUpResources

ViewMessageBodyWriter作爲提供商ViewBundle被添加,這就是爲什麼它在您的服務(您可能有bootstrap.addBundle(new ViewBundle());)工作。

+0

謝謝,我會嘗試,當我回去工作。 – whiterook6

+0

謝謝,那修復了這個異常。我現在得到了一個類似的例外,那就是沒有消息體READER,並且查看視圖包,看起來並沒有那樣的東西。是否還有另一個提供者需要添加,或者需要提供某種註釋以使單元測試正常工作? – whiterook6

+1

看起來像Coda讓你解決:https://groups.google.com/forum/#!topic/dropwizard-user/fGjawn1HTzQ –

0

我使用的是dropwizard 0.8.0-rc3,我的意見是基於freemarker模板的。我嘗試了以上,並保持例外。終於得到它爲我工作的是呼籲

.addProvider(new ViewMessageBodyWriter(new MetricRegistry(), Collections.singleton(new FreemarkerViewRenderer()))) 

在我的ResourceTestRule.builder()