Spring-MVCでspringのsession scopeオブジェクトをテストしたい
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[FrontPage]]
#contents
2008/03/13からのアクセス回数 &counter;
* Spring-MVCでspringのsession scopeオブジェクトをテストし...
Spring 2.0から導入されたsession scopeオブジェクトは、Disp...
MockHttpServletRequestを使った単体テストでは、bean定義フ...
定義されたsession scopeオブジェクトのsession単位での持ち...
** session scopeオブジェクトに必要なもの [#z1d0df69]
session scopeオブジェクトのテストには、
-- GenericWebApplicationContextをcreateApplicationContext...
-- WebApplicationContextのbeanFactoryにSCOPE_REQUEST, SCO...
-- HTTPリクエストを処理する前に、WebApplicationContextに...
-- HTTPリクエストの処理の後に、RequestContextFilterと同じ...
*** AbstractTransactionalSpringWebContextTestsを追加 [#h0...
GenericWebApplicationContextをcreateApplicationContextメ...
AbstractTransactionalSpringWebContextTestsを追加しました。
AbstractTransactionalSpringWebContextTestsのcreateApplica...
#pre{{
protected ConfigurableApplicationContext createApplicati...
GenericWebApplicationContext context =
new GenericWebApplicationContext(
new GenericApplicationContext().getDefaultListableB...
context.setServletContext(new MockServletContext());
customizeBeanFactory(context.getDefaultListableBeanFact...
createBeanDefinitionReader(context).loadBeanDefinitions...
context.refresh();
// StaticWebApplicationContext のpostProcessBeanFactory...
ConfigurableListableBeanFactory beanFactory = context.g...
beanFactory.registerScope(WebApplicationContext.SCOPE_R...
beanFactory.registerScope(WebApplicationContext.SCOPE_S...
beanFactory.registerScope(WebApplicationContext.SCOPE_G...
new SessionScope(true));
return context;
}
}}
*** beginRequest, endRequestメソッドの追加 [#l7d22f78]
HTTPリクエストの前後にRequestContextFilterと同様の処理行...
beginRequestメソッドは、
#pre{{
public void beginRequest(MockHttpServletRequest req) {
ServletRequestAttributes attributes = new ServletReques...
req.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attribut...
RequestContextHolder.setRequestAttributes(attributes);
ServletContext sc = req.getSession().getServletContext();
GenericWebApplicationContext wac = (GenericWebApplicati...
wac.setServletContext(sc);
sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICAT...
}
}}
endRequestメソッドは、
#pre{{
public void endRequest(MockHttpServletRequest req) {
ServletRequestAttributes attributes = (ServletRequestAt...
.getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
ServletRequestAttributes threadAttributes = (ServletReq...
.getRequestAttributes();
if (threadAttributes != null) {
// We're assumably within the original request thread...
if (attributes == null) {
attributes = threadAttributes;
}
RequestContextHolder.setRequestAttributes(null);
LocaleContextHolder.setLocale(null);
}
if (attributes != null) {
attributes.requestCompleted();
if (logger.isDebugEnabled()) {
logger.debug("Cleared thread-bound request context: "...
}
}
}
}}
と定義しました。
** テストメソッドの記述方法 [#r94c1f00]
session scopeオブジェクトのテストメソッドを定義するには、
-- AbstractTransactionalSpringWebContextTestsのサブクラス...
-- HTTP要求を処理するhadleRequestの前後をbeginRequest, en...
-- 同一セッション内の連続する処理をテストする場合には、直...
*** HTTP要求の前後処理例 [#a392de6c]
以下にMemberOpsControllerを例にHTTP要求の前後処理の仕方を...
#pre{{
MemberOpsController memberOpsController =
(MemberOpsController)getApplicationContext().getBean(...
ModelAndView mv = null;
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHttp...
endRequest(req);
}}
*** セッション情報の持ち回り [#h311f391]
同一セッションは、つぎのようにして持ち回ることができます。
#pre{{
HttpSession session = req.getSession();
req = new MockHttpServletRequest("POST","memberops/list...
req.setSession(session);
}}
これで、session scopeオブジェクトの単体テストができるよう...
** サンプルの紹介 [#d85f1193]
このページが分かりづらいとのご指摘が多いので、TestCase例...
- maven-GenMVC-pluginに入っている&ref(AbstractTransaction...
- maven-GenMVC-pluginで生成されるテストケースひな形&ref(T...
を参考にしながら、以下の説明を見てください。
*** テストケースの作成 [#bcc68de6]
AbstractTransactionalSpringWebContextTestsのサブクラスと...
#pre{{
public class TestCase
extends AbstractTransactionalSpringWebContextTests {
}}
*** Sessionを後のリクエストに継承する例 [#m84614cd]
次にSessionを後のリクエストに継承するメソッドを示します。
- HTTP要求の前後にbeginRequest, endRequestで囲む
のは、SpringではフィルタRequestContextFilterの処理と同じ...
例では、handleRequestの前後に挿入してあります。
#pre{{
try {
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHtt...
endRequest(req);
} catch (Exception err) {
err.printStackTrace();
}
}}
- セッションの引き継ぎ
は、新しく生成したMockHttpServletRequestに前回の要求のses...
#pre{{
HttpSession session = req.getSession();
req = new MockHttpServletRequest("POST","memberops/list...
// sessionを次の要求に引き継ぐ
req.setSession(session);
}}
念のために、testmemberOpsController_Listのメソッドを示し...
#pre{{
// memberOpsController list method test
public void testmemberOpsController_List() {
dbUnitHelperDao.restore("src/test/resources/dump.xml");
MockHttpServletRequest req = new MockHttpServletRequest...
MemberOpsController memberOpsController = (MemberOpsCon...
ModelAndView mv = null;
try {
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHtt...
endRequest(req);
} catch (Exception err) {
err.printStackTrace();
}
Member expectedMember = (Member)getApplicationContext()...
assertNull(mv.getViewName());
Member[] members = (Member[])mv.getModel().get("memberL...
assertEquals(memberManager.print(expectedMember), membe...
HttpSession session = req.getSession();
req = new MockHttpServletRequest("POST","memberops/list...
// sessionを次の要求に引き継ぐ
req.setSession(session);
memberOpsController = (MemberOpsController)getApplicati...
mv = null;
try {
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHtt...
endRequest(req);
} catch (Exception err) {
err.printStackTrace();
}
expectedMember = (Member)getApplicationContext().getBea...
assertNull(mv.getViewName());
members = (Member[])mv.getModel().get("memberList");
assertEquals(memberManager.print(expectedMember), membe...
}
}}
** コメント [#y379a8a1]
この記事は、
#vote(おもしろかった[3],そうでもない[1],わかりずらい[18])
皆様のご意見、ご希望をお待ちしております。
- 分かりづらいとのコメントに対し、「サンプルの紹介」とサ...
#comment_kcaptcha
終了行:
[[FrontPage]]
#contents
2008/03/13からのアクセス回数 &counter;
* Spring-MVCでspringのsession scopeオブジェクトをテストし...
Spring 2.0から導入されたsession scopeオブジェクトは、Disp...
MockHttpServletRequestを使った単体テストでは、bean定義フ...
定義されたsession scopeオブジェクトのsession単位での持ち...
** session scopeオブジェクトに必要なもの [#z1d0df69]
session scopeオブジェクトのテストには、
-- GenericWebApplicationContextをcreateApplicationContext...
-- WebApplicationContextのbeanFactoryにSCOPE_REQUEST, SCO...
-- HTTPリクエストを処理する前に、WebApplicationContextに...
-- HTTPリクエストの処理の後に、RequestContextFilterと同じ...
*** AbstractTransactionalSpringWebContextTestsを追加 [#h0...
GenericWebApplicationContextをcreateApplicationContextメ...
AbstractTransactionalSpringWebContextTestsを追加しました。
AbstractTransactionalSpringWebContextTestsのcreateApplica...
#pre{{
protected ConfigurableApplicationContext createApplicati...
GenericWebApplicationContext context =
new GenericWebApplicationContext(
new GenericApplicationContext().getDefaultListableB...
context.setServletContext(new MockServletContext());
customizeBeanFactory(context.getDefaultListableBeanFact...
createBeanDefinitionReader(context).loadBeanDefinitions...
context.refresh();
// StaticWebApplicationContext のpostProcessBeanFactory...
ConfigurableListableBeanFactory beanFactory = context.g...
beanFactory.registerScope(WebApplicationContext.SCOPE_R...
beanFactory.registerScope(WebApplicationContext.SCOPE_S...
beanFactory.registerScope(WebApplicationContext.SCOPE_G...
new SessionScope(true));
return context;
}
}}
*** beginRequest, endRequestメソッドの追加 [#l7d22f78]
HTTPリクエストの前後にRequestContextFilterと同様の処理行...
beginRequestメソッドは、
#pre{{
public void beginRequest(MockHttpServletRequest req) {
ServletRequestAttributes attributes = new ServletReques...
req.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attribut...
RequestContextHolder.setRequestAttributes(attributes);
ServletContext sc = req.getSession().getServletContext();
GenericWebApplicationContext wac = (GenericWebApplicati...
wac.setServletContext(sc);
sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICAT...
}
}}
endRequestメソッドは、
#pre{{
public void endRequest(MockHttpServletRequest req) {
ServletRequestAttributes attributes = (ServletRequestAt...
.getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
ServletRequestAttributes threadAttributes = (ServletReq...
.getRequestAttributes();
if (threadAttributes != null) {
// We're assumably within the original request thread...
if (attributes == null) {
attributes = threadAttributes;
}
RequestContextHolder.setRequestAttributes(null);
LocaleContextHolder.setLocale(null);
}
if (attributes != null) {
attributes.requestCompleted();
if (logger.isDebugEnabled()) {
logger.debug("Cleared thread-bound request context: "...
}
}
}
}}
と定義しました。
** テストメソッドの記述方法 [#r94c1f00]
session scopeオブジェクトのテストメソッドを定義するには、
-- AbstractTransactionalSpringWebContextTestsのサブクラス...
-- HTTP要求を処理するhadleRequestの前後をbeginRequest, en...
-- 同一セッション内の連続する処理をテストする場合には、直...
*** HTTP要求の前後処理例 [#a392de6c]
以下にMemberOpsControllerを例にHTTP要求の前後処理の仕方を...
#pre{{
MemberOpsController memberOpsController =
(MemberOpsController)getApplicationContext().getBean(...
ModelAndView mv = null;
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHttp...
endRequest(req);
}}
*** セッション情報の持ち回り [#h311f391]
同一セッションは、つぎのようにして持ち回ることができます。
#pre{{
HttpSession session = req.getSession();
req = new MockHttpServletRequest("POST","memberops/list...
req.setSession(session);
}}
これで、session scopeオブジェクトの単体テストができるよう...
** サンプルの紹介 [#d85f1193]
このページが分かりづらいとのご指摘が多いので、TestCase例...
- maven-GenMVC-pluginに入っている&ref(AbstractTransaction...
- maven-GenMVC-pluginで生成されるテストケースひな形&ref(T...
を参考にしながら、以下の説明を見てください。
*** テストケースの作成 [#bcc68de6]
AbstractTransactionalSpringWebContextTestsのサブクラスと...
#pre{{
public class TestCase
extends AbstractTransactionalSpringWebContextTests {
}}
*** Sessionを後のリクエストに継承する例 [#m84614cd]
次にSessionを後のリクエストに継承するメソッドを示します。
- HTTP要求の前後にbeginRequest, endRequestで囲む
のは、SpringではフィルタRequestContextFilterの処理と同じ...
例では、handleRequestの前後に挿入してあります。
#pre{{
try {
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHtt...
endRequest(req);
} catch (Exception err) {
err.printStackTrace();
}
}}
- セッションの引き継ぎ
は、新しく生成したMockHttpServletRequestに前回の要求のses...
#pre{{
HttpSession session = req.getSession();
req = new MockHttpServletRequest("POST","memberops/list...
// sessionを次の要求に引き継ぐ
req.setSession(session);
}}
念のために、testmemberOpsController_Listのメソッドを示し...
#pre{{
// memberOpsController list method test
public void testmemberOpsController_List() {
dbUnitHelperDao.restore("src/test/resources/dump.xml");
MockHttpServletRequest req = new MockHttpServletRequest...
MemberOpsController memberOpsController = (MemberOpsCon...
ModelAndView mv = null;
try {
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHtt...
endRequest(req);
} catch (Exception err) {
err.printStackTrace();
}
Member expectedMember = (Member)getApplicationContext()...
assertNull(mv.getViewName());
Member[] members = (Member[])mv.getModel().get("memberL...
assertEquals(memberManager.print(expectedMember), membe...
HttpSession session = req.getSession();
req = new MockHttpServletRequest("POST","memberops/list...
// sessionを次の要求に引き継ぐ
req.setSession(session);
memberOpsController = (MemberOpsController)getApplicati...
mv = null;
try {
beginRequest(req);
mv = memberOpsController.handleRequest(req,new MockHtt...
endRequest(req);
} catch (Exception err) {
err.printStackTrace();
}
expectedMember = (Member)getApplicationContext().getBea...
assertNull(mv.getViewName());
members = (Member[])mv.getModel().get("memberList");
assertEquals(memberManager.print(expectedMember), membe...
}
}}
** コメント [#y379a8a1]
この記事は、
#vote(おもしろかった[3],そうでもない[1],わかりずらい[18])
皆様のご意見、ご希望をお待ちしております。
- 分かりづらいとのコメントに対し、「サンプルの紹介」とサ...
#comment_kcaptcha
ページ名:
SmartDoc