您的位置:首页 > 产品设计 > UI/UE

一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入

2011-07-31 11:51 996 查看
这篇文章将继续上一篇的问题,实现我们的iunit框架与Guice框架的整合,这个模块主要用于那些用Guice来做DI容器的项目做测试用的,包括guice框架的启动与在测试类中自动注入@Inject标注的字段

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标注了字段名后就能直接用了的玄机所在
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐