dropwizard 0.7资源测试中缺少邮件正文读取器



我正试图将一个旧的dropwizard-0.6项目迁移到dropwizard-0.5,但我在资源单元测试中遇到了著名的消息正文读取器错误。

ERROR [2014-05-02 09:52:59,873] com.sun.jersey.api.client.ClientResponse: A message body reader for Java class foo.Bar, and Java type class foo.Bar, and MIME media type application/octet-stream was not found
ERROR [2014-05-02 09:52:59,876] com.sun.jersey.api.client.ClientResponse: The registered message body readers compatible with the MIME media type are:
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader
application/octet-stream ->
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.RenderedImageProvider

我曾经用旧的dropwizard-0.6 ResourceTest添加ViewMessageBodyWriter,如下所示:

@Override
protected void setUpResources() throws Exception {
    ...
    addProvider(ViewMessageBodyWriter.class);
    ...
}

我不能介绍旧的ViewMessageBodyWriter,因为它不再有零参数构造函数:

public class BarResourceTest extends AuthenticatedResourceTest {
    static BarController barController = mock(BarController.class);
    @Mock
    Page<Bar> page;
    @ClassRule
    public static ResourceTestRule resource = ResourceTestRule.builder().addProvider(ViewMessageBodyWriter.class)
        .addResource(new BarResource(barController)).build();
    private Bar bar;
}

有人能在dropwizard-0.7中帮助进行资源测试吗?

你可以试试这个:

@Provider
@Produces(application/octet-stream)
public class YourTestBodyWriter implements MessageBodyWriter<foo.Bar> {
    private static final Logger LOG = LoggerFactory.getLogger(foo.BarBodyWriter.class);
    @Override
    public boolean isWriteable(
        Class<?> type,
        Type genericType,
        Annotation[] annotations,
        MediaType mediaType)
    {
        return foo.Bar.class.isAssignableFrom(type);
    }
    @Override
    public long getSize(
        Bar t,
        Class<?> type,
        Type genericType,
        Annotation[] annotations,
        MediaType mediaType)
    {
        return -1;
    }
    @Override
    public void writeTo(
        Bar t,
        Class<?> type,
        Type genericType,
        Annotation[] annotations,
        MediaType mediaType,
        MultivaluedMap<String, Object> httpHeaders,
        OutputStream entityStream) throws IOException, WebApplicationException
    {
        String message = t.someMethod()
        entityStream.write(message.getBytes(Charsets.UTF_8));
        LOG.info(message);
    }
}

添加到你的应用程序运行((:

// Serializer
environment.jersey().register(new YourTestBodyWriter ());   

这是应用程序中的正常方式。对于junit测试,也许这是有效的(我没有测试!(:

   @ClassRule
    public static ResourceTestRule resource = ResourceTestRule.builder().addProvider(ViewMessageBodyWriter.class)
        .addResource(new BarResource(barController)).addProvider(new YourTestBodyWriter()).build();

最新更新