一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
2011-07-31 11:51
876 查看
这篇文章将继续上一篇的问题,实现我们的iunit框架与Guice框架的整合,这个模块主要用于那些用Guice来做DI容器的项目做测试用的,包括guice框架的启动与在测试类中自动注入@Inject标注的字段
1.目标测试类的庐山真面目
2.GuiceStartupListener类
1.目标测试类的庐山真面目
package com.crazycoder2010.guice.sample; import org.junit.Test; import com.crazycoder2010.iunit.AbstractIUnitTestCase; import com.crazycoder2010.iunit.GuiceStratupListener; import com.crazycoder2010.iunit.annotation.GuiceModuleConfiguration; import com.crazycoder2010.iunit.annotation.IUnitTestExecuteListeners; import com.google.inject.Inject; @GuiceModuleConfiguration(classes={MyModule.class})//标注一下当前测试用例需要加载哪几个模块 @IUnitTestExecuteListeners(value={GuiceStratupListener.class})//启动Guice监听器,这样我们@GuiceModuleConfiguraition标注的内容才能生效:) public class ClientTest extends AbstractIUnitTestCase { @Inject //要用到的服务 private Client client; @Test public void testClientGo(){ client.go();//直接调用就可以了,框架已经帮你注入了client的值,因此不会有空指针出现了 } }我们看到这个TestCase继承了我们第3节里介绍到的统一父类,然后注册了自己的IUnitTestExecuteListerner=GuiceStarupListener,然后还有个注解@GuiceModuleConfiguration,表示我们这个测试类要加载那几个Module,测试类中用到那几个服务,只要用@Inject标注一下实例变量即可--very simple
2.GuiceStartupListener类
package com.crazycoder2010.iunit; import java.util.ArrayList; import java.util.List; import com.crazycoder2010.iunit.annotation.GuiceModuleConfiguration; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; /** * 用来启动Guice容器的Listener * * @author Kevin * */ public class GuiceStratupListener extends IUnitTestExecuteListenerAdapter { @Override public void prepareTestInstance(TestContext testContext) throws Exception { //读取Guice modules Class<?> c = testContext.getTestInstance().getClass(); List<Class<? extends Module>> moduels = new ArrayList<Class<? extends Module>>(); while(c != null){ GuiceModuleConfiguration configuration = testContext.getTestInstance() .getClass().getAnnotation(GuiceModuleConfiguration.class); if(configuration != null){ for(Class<? extends Module> cl : configuration.classes()){ if(!moduels.contains(cl)){//去重 moduels.add(cl); } } } c = c.getSuperclass(); } Module[] modulesArray = new Module[moduels.size()]; for(int i = 0; i < moduels.size(); i++){ modulesArray[i] = moduels.get(i).newInstance(); } //初始化injector Injector injector = Guice.createInjector(modulesArray); injector.injectMembers(testContext.getTestInstance());//这句是核心,让injector为当前testcase对象注入属性值,这也是为什么@Inject标注了字段名后就能直接用了的玄机所在 } }
相关文章推荐
- 一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
- 一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值
- 一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据
- 一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据
- 一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束
- 一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束
- 一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 一个通用的单元测试框架的思考和设计03-实现篇-核心类源码
- 一个通用的单元测试框架的思考和设计03-实现篇-核心类源码
- 一个通用的单元测试框架的思考和设计09-实现篇-视图操作
- 一个通用的单元测试框架的思考和设计09-实现篇-视图操作
- 一个通用的单元测试框架的思考和设计02-设计篇
- 一个通用的单元测试框架的思考和设计02-设计篇
- 一个通用的单元测试框架的思考和设计01-思考篇
- 一个通用的单元测试框架的思考和设计01-思考篇
- 通用权限系统框架功能实现设计
- 如何开发一个java开源框架-----Jvn框架之实现自动生成在线文档(第七讲)
- 采用一个自创的"验证框架"实现对数据实体的验证[设计篇]