【发布时间】:2015-06-16 09:42:53
【问题描述】:
我从过滤器的上下文中获取Providers 以定义ObjectMapper
public class Filter implements ContainerRequestFilter, ContainerResponseFilter {
@Context
private Providers providers;
@Context
private HttpServletRequest request;
private ObjectMapper getObjectMapper() {
ContextResolver<ObjectMapper> contextResolver = providers.getContextResolver(ObjectMapper.class, MediaType.APPLICATION_JSON_TYPE);
if (contextResolver == null) {
return new ObjectMapper();
}
return contextResolver.getContext(null);
}
}
但在测试中,我无法使用带有HttpServletRequest 的抽象绑定器在此过滤器中注入模拟,它工作正常,但Providers 不是模拟。测试示例:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "..." })
@PrepareForTest({ ... })
public class Test extends JerseyTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
private HttpServletRequest request;
private Providers providers;
@Override
protected Application configure() {
ResourceConfig config = new ResourceConfig(TestResource.class, Filter.class);
providers = mock(Providers.class);
request = mock(HttpServletRequest.class);
config.register(new AbstractBinder() {
@Override
protected void configure() {
bind(providers).to(Providers.class);
}
});
config.register(new AbstractBinder() {
@Override
protected void configure() {
bind(request).to(HttpServletRequest.class);
}
});
return config;
}
为什么HttpServletRequest 在过滤器中是模拟的,而Providers 不是?
【问题讨论】:
-
我的猜测是因为它是由框架处理的。通常
HttpServletRequest将由框架处理,但因为你不是running within a servlet container,所以它使用你的模拟,因为找不到正常的模拟。你可以测试这个理论(我没有这样做),通过点击链接并设置 servlet 环境,看看是否仍然使用模拟请求。 -
至于你想要完成的事情,为什么不创建一个虚拟的
ContextResolver并注册那个。这与尝试模拟Providers并返回 thatContextResolver几乎相同 -
我已经有上下文解析器公共类 JerseyObjectMapperProvider 实现了 ContextResolver
{ bla bla }。但没有在示例中添加...我已经在资源 onfig 中注册了它,但它没有帮助 -
“没有帮助”是什么意思。你的意思是它没有被发现?
-
providers.getContextResolver(ObjectMapper.class, MediaType.APPLICATION_JSON_TYPE) - 返回 null。
标签: java mocking jersey integration-testing inject