共通のユニットテストフレームワークの思考と設計05-実装編-Guiceフレームワークの起動と自動注入


この記事では、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節で紹介した統一親を継承しているのを見て、それから自分のI U i n t TestExecuteListener=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 
	}
}