如何重构我的 servlet 以利用依赖注入?
我正在使用 Tomcat 6.0.33 和 Java 6。我有这个 servlet ...
public class SaveXmlServlet extends HttpServlet {
private CacheService cacheService;
public void init(ServletConfig config) throws ServletException {
cacheService = CacheServiceLocator.cacheService();
} // init
我怎样才能重新设计我的 servlet ...
- 利用依赖注入,以便像mockito这样的模拟框架可以注入自己的“cacheService”实现
- 保证我的 jvm 中只有一个缓存服务实例。现在,“CacheServiceLocator.cacheService()”行保证了这一点。
?我没有使用(或允许使用)Spring 或 Guice 等框架。感谢您对重构此内容的任何想法。谢谢,-戴夫
I'm using Tomcat 6.0.33 with Java 6. I have this servlet ...
public class SaveXmlServlet extends HttpServlet {
private CacheService cacheService;
public void init(ServletConfig config) throws ServletException {
cacheService = CacheServiceLocator.cacheService();
} // init
How can I redesign my servlet to ...
- Take advantage of dependency injection so that a mocking framework like mockito can inject its own "cacheService" implementation
- Guarantee that there is only one instance of cacheservice in my jvm. Right now the line "CacheServiceLocator.cacheService()" guarantees this.
? I'm not using (or allowed to use) frameworks like Spring or Guice. Grateful for any thoughts on refactoring this. Thanks, - Dave
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有一些选择,尽管我建议惩罚那些不“让”你使用框架的人。两个快手;我确信还有其他人。我会先走打脸路线。
您可以使用 EasyMock/Mockito 和 PowerMock 的组合来模拟静态类。从技术上讲,您根本不需要更改任何内容即可获得您想要的测试行为。
Servlet 初始化参数或 JNDI 资源提供的类名可用于创建缓存定位器的实例。为其提供设置器允许一个单元/等。测试将其设置在班级上。
There are a few options, although I recommend smacking someone for not "letting" you use a framework. Two quickies; I'm sure there are others. I'd go the smacking route first.
You can mock static classes using a combination of EasyMock/Mockito and, say, PowerMock. Technically you don't need to change anything at all to get the in-test behavior you want.
A class name provided by a servlet init parameter or JNDI resource could be used to create an instance of the cache locator. Providing a setter for the same allows a unit/etc. test to set it on the class.