View Javadoc

    1   /*
    2    * Copyright 2004-2009 the Seasar Foundation and the Others.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *     http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    13   * either express or implied. See the License for the specific language
    14   * governing permissions and limitations under the License.
    15   */
    16  package org.seasar.cubby.plugins.s2.unit;
    17
    18  import java.lang.reflect.Field;
    19
    20  import javax.servlet.http.HttpServletRequest;
    21  import javax.servlet.http.HttpServletResponse;
    22
    23  import org.seasar.cubby.action.ActionResult;
    24  import org.seasar.cubby.unit.CubbyAssert;
    25  import org.seasar.cubby.unit.CubbyRunner;
    26  import org.seasar.framework.mock.servlet.MockHttpServletRequest;
    27  import org.seasar.framework.mock.servlet.MockHttpServletResponse;
    28  import org.seasar.framework.unit.S2TigerTestCase;
    29
    30  /**
    31   * CubbyのActionクラスの単体テスト用のクラスです。
    32   * <p>
    33   * このクラスを継承して、それぞれのActionクラス用の単体テストを作成します。詳細はドキュメントの「アクションのテスト」を参照下さい。
    34   *
    35   * <pre>
    36   * public class HelloActionTest extends CubbyTestCase {
    37   * 	// 対象のアクション
    38   * 	private HelloAction action;
    39   *
    40   * 	// 初期化処理
    41   * 	protected void setUp() throws Exception {
    42   * 		// diconファイルの読み込み
    43   * 		include(&quot;app.dicon&quot;);
    44   * 	}
    45   *
    46   * 	public void testIndex() throws Exception {
    47   * 		// アクションの実行
    48   * 		ActionResult result = processAction(&quot;/hello/&quot;);
    49   * 		// 結果のチェック
    50   * 		assertPathEquals(Forward.class, &quot;input.jsp&quot;, result);
    51   * 	}
    52   *
    53   * 	public void setUpMessage() {
    54   * 		// リクエストパラメータのセット
    55   * 		getRequest().addParameter(&quot;name&quot;, &quot;name1&quot;);
    56   * 	}
    57   *
    58   * 	public void testMessage() throws Exception {
    59   * 		// アクションの実行
    60   * 		ActionResult result = processAction(&quot;/hello/message&quot;);
    61   * 		// 結果のチェック
    62   * 		assertPathEquals(Forward.class, &quot;result.jsp&quot;, result);
    63   * 		// 実行後のアクションの状態を確認
    64   * 		assertEquals(&quot;name1&quot;, action.name);
    65   * 	}
    66   * }
    67   * </pre>
    68   *
    69   * <pre>
    70   * public class TodoActionTest extends CubbyTestCase {
    71   *
    72   * 	private TodoAction action;
    73   *
    74   * 	public void setUpShow() throws Exception {
    75   * 		emulateLogin();
    76   * 	}
    77   *
    78   * 	private void emulateLogin() throws Exception {
    79   * 		User user = new User();
    80   * 		user.setId(&quot;mock&quot;);
    81   * 		user.setName(&quot;mock&quot;);
    82   * 		user.setPassword(&quot;mock&quot;);
    83   * 		getRequest().getSession().setAttribute(&quot;user&quot;, user);
    84   * 	}
    85   *
    86   * 	public void testShow() throws Exception {
    87   * 		this.readXlsAllReplaceDb(&quot;TodoActionTest_PREPARE.xls&quot;);
    88   * 		// CoolURIの場合のテスト
    89   * 		ActionResult result = processAction(&quot;/todo/1&quot;);
    90   * 		assertPathEquals(Forward.class, &quot;show.jsp&quot;, result);
    91   * 		assertEquals(new Integer(1), action.id);
    92   * 		assertEquals(&quot;todo1&quot;, action.text);
    93   * 		assertEquals(&quot;todo1 memo&quot;, action.memo);
    94   * 		assertEquals(new Integer(1), action.todoType.getId());
    95   * 		assertEquals(&quot;type1&quot;, action.todoType.getName());
    96   * 		assertEquals(&quot;2008-01-01&quot;, action.limitDate);
    97   * 	}
    98   * }
    99   * </pre>
    100  *
    101  * </p>
    102  *
    103  * @author agata
    104  * @author baba
    105  */
    106 public abstract class CubbyTestCase extends S2TigerTestCase {
    107
    108 	/**
    109 	 * ActionResultの型とパスをチェックします。
    110 	 *
    111 	 * @param resultClass
    112 	 *            ActionResultの型
    113 	 * @param expectedPath
    114 	 *            期待されるパス
    115 	 * @param actualResult
    116 	 *            チェックするActionResult
    117 	 */
    118 	public static void assertPathEquals(
    119 			final Class<? extends ActionResult> resultClass,
    120 			final String expectedPath, final ActionResult actualResult) {
    121 		CubbyAssert.assertPathEquals(resultClass, expectedPath, actualResult);
    122 	}
    123
    124 	/**
    125 	 * ActionResultの型とパスをチェックします。
    126 	 *
    127 	 * @param resultClass
    128 	 *            ActionResultの型
    129 	 * @param expectedPath
    130 	 *            期待されるパス
    131 	 * @param actualResult
    132 	 *            チェックするActionResult
    133 	 * @param characterEncoding
    134 	 *            URI のエンコーディング
    135 	 */
    136 	public static void assertPathEquals(
    137 			final Class<? extends ActionResult> resultClass,
    138 			final String expectedPath, final ActionResult actualResult,
    139 			final String characterEncoding) {
    140 		CubbyAssert.assertPathEquals(resultClass, expectedPath, actualResult,
    141 				characterEncoding);
    142 	}
    143
    144 	/**
    145 	 * アクションメソッドを実行します。
    146 	 *
    147 	 * @param originalPath
    148 	 *            オリジナルパス
    149 	 * @return アクションメソッドの実行結果。アクションメソッドが見つからなかったり結果がない場合は <code>null</code>
    150 	 * @throws Exception
    151 	 *             アクションメソッドの実行時に例外が発生した場合
    152 	 */
    153 	protected ActionResult processAction(final String originalPath)
    154 			throws Exception {
    155 		final MockHttpServletRequest request = getRequest();
    156 		setServletPath(request, originalPath);
    157 		final MockHttpServletResponse response = getResponse();
    158 		return processAction(request, response);
    159 	}
    160
    161 	/**
    162 	 * 指定されたモックリクエストのサーブレットパスを設定します。
    163 	 *
    164 	 * @param request
    165 	 *            リクエスト
    166 	 * @param servletPath
    167 	 *            サーブレットパス
    168 	 */
    169 	private static void setServletPath(final MockHttpServletRequest request,
    170 			final String servletPath) {
    171 		try {
    172 			final Field servletPathField = request.getClass().getDeclaredField(
    173 					"servletPath");
    174 			servletPathField.setAccessible(true);
    175 			servletPathField.set(request, servletPath);
    176 		} catch (final Exception ex) {
    177 			throw new IllegalStateException(ex);
    178 		}
    179 	}
    180
    181 	/**
    182 	 * アクションメソッドを実行します。
    183 	 *
    184 	 * @param request
    185 	 *            要求
    186 	 * @param response
    187 	 *            応答
    188 	 * @return アクションメソッドの実行結果。アクションメソッドが見つからなかったり結果がない場合は <code>null</code>
    189 	 * @throws Exception
    190 	 *             アクションメソッドの実行時に例外が発生した場合
    191 	 */
    192 	protected ActionResult processAction(final HttpServletRequest request,
    193 			final HttpServletResponse response) throws Exception {
    194 		return CubbyRunner.processAction(request, response);
    195 	}
    196
    197 }