我正试图将一个旧的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();