FrontPage 2008/01/15からのアクセス回数 8089

Spring-MVCプラグイン機能追加(テストケース)

Spring-MVC用archeTypeプラグインには、単体テスト用のひな形が含まれていなかったので 1.1.0版でテストケースを取り込みました。

Spring-MVCプラグイン1.1.0のインストール

Spring-MVCプラグインの1.1.0のインストールには以下の4ファイルが必要です。

上記の添付ファイルをダウンロードしてください。近々公開用リポジトリを用意する予定です(それまでinstall-fileをご使用ください)。

テストケースで追加されたファイル

テストケースで追加されたファイルは以下の通りです。

fileTree.jpg

JUnit用のjavaクラスファイルです。

これらは、main/webapp/WEB-INFのファイルと同じものを使用します。 ''特にapplicationContext.xml, servlet-stub.xmlはGenMVCプラグインを実行すると 変更されますので、test/resourcesへのコピーが必要です。''

JUnit用に以下の定義を追加しました。

	<!-- TransactionManager -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<!-- DbUnitHelperDao -->
	<bean id="dbUnitHelperDao" 
		class="jp.co.pwv.utils.DbUnitHelperDao">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

transactionManagerは、AbstractTransactionalSpringContextTestsが必要とし、 dbUnitHelperDaoは、DbUnitHelperDaoが必要とします。 DbUnitHelperDaoは、テストデータのdump, resotoreとprintメソッドを提供します。 GenMVCプラグインで新たにManagerクラスを追加した場合には、TestCase.javaの35行

		dbUnitHelperDao.addHelper(memberManager.getHelper());

addHelperでManagerクラスのhelperを追加登録してください。

単体テストでは、デバッグ時にデータベースの状態を確認する必要がありますので、 HSQLDBのサーバ機能を使用するように変更しました。

# サーバとして使用する場合
db.url=jdbc:hsqldb:hsql://localhost

HSQLDBのインストールは、http://www.pwv.co.jp/take_public_html/DevTool/DevTool_c8.html#doc1_498 を参照してください。

DBUnitのFlatXmlDataSet形式のテストデータ記述ファイルです。 dump.xmlの内容は、

<?xml version="1.0" encoding="Windows-31J"?>
<dataset>
	<T_MEMBER
		address='Nakano-ku'
		id='1'
		name='Hiroshi TAKEMOTO'/>
</dataset>

のようなテーブル名をタグとし、フィールド名を属性とするXMLファイルです。

単体テストでは、検証用のデータをプログラムで用意する必要があります。これをjavaで記述すると 非常に面倒なので、Springの機能を使って検証用テストデータを作成するために用意しました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
        "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
	<bean id="expectedMember" class="example.test.domain.Member">
		<property name="id" value="1" />
		<property name="name" value="Hiroshi TAKEMOTO" />
		<property name="address" value="Nakano-ku" />
	</bean>
	
</beans>

ひな形の作成

最初のバージョンと変更となるはarchetypeVersionだけです。

例題は、

mvn archetype:create \
	-DgroupId=example.test \
	-DartifactId=test \
	-DarchetypeArtifactId=spring-mvc-archetype \
	-DarchetypeGroupId=jp.co.pwv.spring-mvc-archetype \
	-DarchetypeVersion=1.1.0

となります。

単体テストの実行

HSqlDBのサーバを起動します。HSqlDBをインストールしたディレクトリをHSQLDB_HOMEとすると

cd $HSQLDB_HOME/demo
./runServer.sh

Windowsの場合には、runServer.batを使用してください。

テストケースについて

設定の前準備

データベースを扱っているため、テストの影響がないようにAbstractTrasactionalSpringContextTestsを継承しています。

Springの設定ファイルは、getConfigLocationsメソッドで返すようにします。

	public String[] getConfigLocations() {
		return new String[] {
				"WEB-INF/applicationContext.xml",
				"WEB-INF/custom-editor.xml",
				"WEB-INF/db-def.xml",
				"WEB-INF/servlet-def.xml",
				"WEB-INF/servlet-stub.xml",
				"testdata-def.xml"
		};
	}

各テストでの開始の処理をonSetUpInTransactionで、終了の処理をonTearDownInTransactionで定義することができます。ひな形では、MemberManager, dbUnitHelperをApplicationContextから取得し、dbUnitHelperにmemberManagerのhelperを登録しています。

	public void onSetUpInTransaction() throws Exception {
		super.onSetUpInTransaction();
		memberManager = (MemberManager)getApplicationContext().getBean("memberManager");
		dbUnitHelperDao = (DbUnitHelperDao)getApplicationContext().getBean("dbUnitHelperDao");
		dbUnitHelperDao.addHelper(memberManager.getHelper());
	}

	public void onTearDownInTransaction() throws Exception {
		super.onTearDownInTransaction();
	}	

memberManager(Daoのテスト)

Daoのテストの例をtestFindByIdメソッドに示します。

通常はこのようにしますが、helperのprintメソッド使う方法も例としてあげています。 testFindByIdメソッドは、以下の通りです。

	public void testFindById() {		
		dbUnitHelperDao.restore("src/test/resources/dump.xml");

		Member member = memberManager.findById(new Integer(1));
		assertEquals("Hiroshi TAKEMOTO", member.getName());
		assertEquals("Nakano-ku", member.getAddress());	
		// or you can check using IMember.print method.
		Member expectedMember = (Member)getApplicationContext().getBean("expectedMember");
		System.out.println(memberManager.print(member));
		assertEquals(memberManager.print(expectedMember), memberManager.print(member));
	}

EditMemberController(コントローラのテスト)

EditMemberControllerのテストには、MockHttpServletRequestを使います。

testEditMemberControllerは、以下の通りです。

	public void testEditMemberController() {
		dbUnitHelperDao.restore("src/test/resources/dump.xml");

		MockHttpServletRequest req = new MockHttpServletRequest("POST","editMember.htm");
		req.addParameter("id","1");
		EditMemberController	editMemberController = (EditMemberController)getApplicationContext().getBean("editMemberController");
		ModelAndView mv = null;
		try {
			mv = editMemberController.handleRequest(req,new MockHttpServletResponse());
		} catch (Exception err) {
			err.printStackTrace();
		}
		Member expectedMember = (Member)getApplicationContext().getBean("expectedMember");

		assertEquals("redirect:memberops/list.htm", mv.getViewName());
		Member member = (Member)mv.getModel().get("member");
		assertEquals(memberManager.print(expectedMember), memberManager.print(member));

	}

簡単単体テスト

単体テストを記述することは最初は億劫ですが、一度ひな形ができるとそのパターンをコピー・ペーストすれば 他のテストが簡単にできるので、テストケースのひな形を使って単体テストに挑戦してみてください。

コメント

この記事は、

選択肢 投票
おもしろかった 1  
そうでもない 2  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc