【问题标题】:Unit testing views in dropwizarddropwizard 中的单元测试视图
【发布时间】:2013-03-28 20:55:31
【问题描述】:

我正在尝试测试从drowpizard 资源返回的视图是否正确组装。具体来说,添加用户的视图有一个字段,如果密码检查器不符合某些规则,则该字段允许密码检查器拒绝创建用户的尝试。该视图在部署和运行 web 应用程序并指定错误密码时效果很好,但是当我尝试对其进行单元测试时,它会引发一个 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,不适用于响应或视图或其他东西)但我更想知道如何正确测试可以返回的资源响应代码或视图。

【问题讨论】:

    标签: java unit-testing dropwizard


    【解决方案1】:

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

    ViewMessageBodyWriterViewBundle 添加为提供者,这就是它在您的服务中工作的原因(您可能有bootstrap.addBundle(new ViewBundle());)。

    【讨论】:

    • 谢谢,解决了这个异常。我现在得到一个类似的异常,关于没有消息正文阅读器,并且通过视图包查看,似乎没有任何类似的东西。是否需要添加其他提供程序或需要提供某种注释才能使单元测试正常工作?
    【解决方案2】:

    我使用的是 dropwizard 0.8.0-rc3,我的视图是基于 freemarker 模板的。我尝试了上述方法并不断收到异常。最终让它为我工作的是调用

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

    在我的ResourceTestRule.builder()上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多