我目前正在开发基于 RESTeasy 的 RESTful 服务。我有一个过滤器类,它用作服务器请求过滤器和服务器响应过滤器(即它实现ContainerRequestFilter和ContainerResponseFilter接口)。
在请求开始时,我使用过滤器将一个对象放入ThreadLocal. 这个对象在整个请求中被资源使用。在请求结束时,在发送响应之前,过滤器从 中删除对象ThreadLocal。
我的问题是是否可以保证请求过滤器、资源和响应过滤器都将在同一线程中执行?是否有可能在请求过滤器将对象放入 之后ThreadLocal,另一个线程将执行请求(因此无法访问该对象)?
我确信情况确实如此,但后来我看到了这个http://jersey.576304.n2.nabble.com/Does-filter-method-of-ContainerRequestFilter-run-in-resource-method-thread-td7582648.html(泽西官方论坛)现在我有疑问。
我有一个基于RestEasy的服务,其中正在ContainerResponseFilter中进行一些清理工作。问题是,如果资源抛出了未知的运行时异常(即我没有映射器的异常),则ContainerResponseFilter永远不会执行。
这是预期的行为吗?有没有解决方法?我在看以下问题(乔纳斯的回答):
如何在RESTful JAX-RS Web服务中记录未捕获的异常?
并且即使在控制器中引发异常时,看起来好像也会执行ContainerResponseFilter吗?
我想念什么吗?
我是测试驱动开发的新手,无法弄清楚如何为我编写的类编写有效的测试.该类如下(Java):
public class MyServiceClassImpl implements MyService {
private someExternalClient client;
private anotherExternalClient anotherClient;
public MyServiceClassImpl() {
client = someExternalClient.getInstance();
anotherClient = anotherExternalClient(client);
}
public String methodWhichDoesSomething(String query) {
return anotherClient.getResponse(query);
}
}
Run Code Online (Sandbox Code Playgroud)
对于测试,我尝试了几个查询,并将我得到的响应与我期望的响应进行比较(我期待它,因为我知道anotherClient将返回什么).它工作正常但这在技术上是一个集成测试,因为我调用外部依赖.在这种情况下,我不明白如何编写"单元"测试.更具体地说,我不知道如何模拟依赖项,因为字段是私有的,没有setter,构造函数不接受任何参数.即使我创建了它们,我如何用我的模拟"提供"类的实例?我自己也写了这个课程,所以请告诉我是否应该重新设计课程,或者提供入门者和制定者?
jax-rs ×2
resteasy ×2
easymock ×1
jersey ×1
junit ×1
mocking ×1
thread-local ×1
unit-testing ×1