プロフィール

Author:はるかわ しおん
なにか、新しいものを。
そして、楽しいものを。

FC2カウンター


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Spring でセッションスコープを使い、JUnit 単体テスト

Spring2.0 を使っているが、どうもセッション周りの情報がない。
Bean のスコープに request/session が追加されたというが、具体的にそれをどう使えばよいのかよくわからん。

SpringMVC からでないと使えないのか、Spring と連携した Struts からでもいいのか、ピュアな JSP-Servlet だけの場合はやっぱり使えないのか。そのへんがね・・・。

さしあたり、SpringMVC を使って構築したサンプルアプリにおいて、コントローラでセッションを利用してみた。
この記事は、それを JUnit テストしたときの (自分向けの!) 覚書です。

少なくとも、これで意図することはできたのだが、正しいやり方なのかどうかよくわからんので注意。

※このアプリについて説明していませんが、前々画面でアカウント名をセッションに保持し、前画面でデータベース検索用の各種値を投げてきているだけのものです。私はわかっているので、詳細は割愛。




・コントローラクラス

package jp.co.example.presentation.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.co.example.logic.Bumon;
import jp.co.example.logic.BumonService;
import jp.co.example.logic.LoginInfo;
import jp.co.example.presentation.command.AddAndGetAllCommand;
import jp.co.example.util.Exception;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;



/**
* コントローラ
*/
public class AddAndGetAllController extends SimpleFormController {

private LoginInfo loginInfo = null;

private BumonService bumonService = null;

public void setBumonService(BumonService bumonService) {
this.bumonService = bumonService;
}

public void setLoginInfo(LoginInfo loginInfo) {
this.loginInfo = loginInfo;
}

/**
* サブミットボタンが押されたときの処理
*/
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException bind)
throws Exception {

try {
System.out.println("LoginInfo@AddAndGetAllController: " + loginInfo.getAccount()); // これでいいのかな??? (loginInfo を DI させてる)

if (loginInfo.getAccount().equals("")) {
throw new Exception("アカウントがない!!!");
}
} catch (Exception e) {
e.printStackTrace();

throw new Exception("なんかおかしい:" + e.toString());

}

// 入力クラスをキャストし、メッセージを取り出す
AddAndGetAllCommand addAndGetAllCommand = (AddAndGetAllCommand)command;


// データベース検索
Bumon bumon = new Bumon(); // 部門コード
bumon.setDeptCd(Integer.parseInt(addAndGetAllCommand.getDeptCd()));
bumon.setDeptName(addAndGetAllCommand.getDeptName());

List resultBumonList = bumonService.addAndGetAll(bumon); // 検索


// データ受け渡し・画面遷移
ModelAndView mav = new ModelAndView(getSuccessView(), bind.getModel());
mav.addObject("bumonList", resultBumonList);

return mav;

}

}




・コマンドクラス (アカウント名を受け取る)

package jp.co.example.logic;

public class LoginInfo {

private String account;

public String getAccount() {
return account;
}

public void setAccount(String account) {
this.account = account;
}


}




・Bean定義ファイル SpringMVCDeptest-servlet.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<!-- Spring ビュー名からJSPファイルを紐付けるクラス -->
<bean id="viewResolver"
class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

<!-- DataSource -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>


<!-- PropertyPlaceholder -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/classes/database_Pgsql.properties" /> <!-- PostgreSQL用 -->
</bean>


<!-- dao/DAO -->
<bean id="bumonDao" class="jp.co.example.dao.BumonDaoImplPgsql"> <!-- PostgreSQL用 -->
<property name="dataSource" ref="dataSource" />
</bean>


<!-- logic/Service -->
<bean id="bumonService" class="jp.co.example.logic.BumonServiceImpl">
<property name="bumonDao" ref="bumonDao" />
</bean>


<!-- セッション保持オブジェクト -->
<bean id="loginInfo" class="jp.co.example.logic.LoginInfo" scope="session" >
<!-- <aop:scoped-proxy /> -->
</bean>


<!-- コントローラ -->
<bean name="/login.form"
class="jp.co.example.presentation.controller.LoginController" scope="session">
<property name="formView" value="index" />
<property name="successView" value="menu" />
<property name="commandClass" value="jp.co.example.presentation.command.LoginCommand"/>
<property name="commandName" value="loginCommand"/>
<property name="loginInfo" ref="loginInfo"/>
</bean>

<bean name="/get.form"
class="jp.co.example.presentation.controller.GetController" scope="session">
<property name="formView" value="menu" />
<property name="successView" value="get" />
<property name="commandClass" value="jp.co.example.presentation.command.GetCommand"/>
<property name="commandName" value="getCommand"/>
<property name="bumonService" ref="bumonService"/>
<property name="loginInfo" ref="loginInfo"/>
</bean>

<bean name="/addAndGetAll.form"
class="jp.co.example.presentation.controller.AddAndGetAllController" scope="session">
<property name="formView" value="menu" />
<property name="successView" value="addAndGetAll" />
<property name="commandClass" value="jp.co.example.presentation.command.AddAndGetAllCommand"/>
<property name="commandName" value="addAndGetAllCommand"/>
<property name="bumonService" ref="bumonService"/>
<property name="loginInfo" ref="loginInfo"/>
</bean>


</beans>




・テストクラス

package jp.co.example.presentation.controller;

import java.util.List;

import jp.co.example.logic.Bumon;
import jp.co.example.logic.LoginInfo;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.SessionScope;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
* あとから気づいたが、
* http://www.pwv.co.jp/~take/TakeWiki/index.php?Spring-MVC%E3%81%A7spring%E3%81%AEsession%20scope%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%97%E3%81%9F%E3%81%84
* もすごくよさそうである。要確認。
*
*/
public class AddAndGetAllControllerTest extends
AbstractDependencyInjectionSpringContextTests {

private ServletRequestAttributes attributes;

private Controller controller;

@Override
protected String[] getConfigLocations() {
// scope.xml has one bean with scope="session"
return new String[] { "jp/co/example/presentation/controller/SpringMVCDeptest-servlet_testsession.xml" };
}

private void setUpRequest(ConfigurableApplicationContext context) {
context.getBeanFactory().registerScope("session", new SessionScope());
MockHttpServletRequest request = new MockHttpServletRequest();
attributes = new ServletRequestAttributes(request);
RequestContextHolder.setRequestAttributes(attributes);
}

@Override
protected void prepareTestInstance() throws Exception {
setUpRequest(applicationContext);
super.prepareTestInstance();
}

public void testOnSubmit() {

// セッションの用意・・・も Spring にまかせる感じで動いたが、これでいいのかは不明。ぐぐっても情報なし。でも、考えてみれば、「Spring にまかせる」とはこういうことか?
LoginInfo loginInfo = (LoginInfo)this.getApplicationContext().getBean("loginInfo");
loginInfo.setAccount("LOGIN ACCOUNT");


controller = (Controller)this.getApplicationContext().getBean("/addAndGetAll.form");

MockHttpServletRequest req = new MockHttpServletRequest("POST", "addAndGetAll.form");
req.addParameter("deptCd", "0");
req.addParameter("deptName", "モックでテキトーに返してくるので、ここの値はなんでもいい");

ModelAndView mv = null;
try {
mv = controller.handleRequest(req,
new MockHttpServletResponse());
System.out.println("VIEW: " + mv.getViewName());
} catch (Exception err) {
err.printStackTrace();
fail();
}

// 遷移先のチェック
assertEquals("addAndGetAll", mv.getViewName());

// 受け渡しオブジェクトのチェック
List resultBumonList =(List)mv.getModel().get("bumonList");
assertEquals(resultBumonList.size(), 2);
assertEquals(resultBumonList.get(0).getDeptCd(), 1);
assertEquals(resultBumonList.get(0).getDeptName(), "モックで追加しました1");
assertEquals(resultBumonList.get(1).getDeptCd(), 2);
assertEquals(resultBumonList.get(1).getDeptName(), "モックで追加しました2");


}

}



コメント

コメントの投稿

   管理者にだけ表示を許可する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。