在dropwizard中单元测试视图

时间:2013-03-28 20:55:32

标签: java unit-testing dropwizard

我正在尝试测试从drowpizard资源返回的视图是否正确组装。具体而言,添加用户的视图具有一个字段,该字段允许密码检查器拒绝在未满足某些规则的情况下构建用户的尝试。在部署和运行webapp并指定错误密码时,该视图效果很好,但是当我尝试对其进行单元测试时,它会抛出一个Web应用程序异常,说该视图没有消息正文编写器。

我的单元测试很简单:

@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);
    }

    // ...
}

我可以理解异常(它知道的编写器,如StringProvider和ByteArrayProvider,不适用于响应或视图等)但我更想知道如何正确测试可以返回的资源响应代码或视图。

2 个答案:

答案 0 :(得分:4)

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

ViewMessageBodyWriterViewBundle添加为提供商,这就是为什么它适用于您的服务(您可能拥有bootstrap.addBundle(new ViewBundle());)。

答案 1 :(得分:0)

我正在使用dropwizard 0.8.0-rc3,我的观点是基于freemarker模板的。我尝试了上述内容并不断获得例外。最终让它为我工作的是打电话

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

ResourceTestRule.builder()上。