/*
* Copyright (c) 2007 NTT DATA Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jp.terasoluna.fw.validation.springmodules;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.FastHashMap;
import org.apache.commons.validator.Arg;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Msg;
import org.apache.commons.validator.ValidatorAction;
import org.junit.Test;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.validation.Errors;
/**
* {@link jp.terasoluna.fw.validation.springmodules.SpringValidationErrors} クラスのブラックボックステスト。
* <p>
* <h4>【クラスの概要】</h4> Springフレームワークのorg.springframework.validation.Errorsインタフェースに エラー情報を追加するためのクラス。<br>
* ※addErrorの引数FieldとValidatorActionにnullは入らない。
* <p>
* @see jp.terasoluna.fw.validation.springmodules.SpringValidationErrors
*/
public class SpringValidationErrorsTest {
/**
* testSetErrors01() <br>
* <br>
* (正常系) <br>
* 観点:C <br>
* <br>
* 入力値:(引数) errors:Errorsインスタンス<br>
* (状態) errors:null<br>
* <br>
* 期待値:(状態変化) errors:引数と同一のErrorsインスタンス<br>
* <br>
* 引数の値が属性に正常に設定されること <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testSetErrors01() throws Exception {
// 前処理
SpringValidationErrors validation = new SpringValidationErrors();
ReflectionTestUtils.setField(validation, "errors", null);
Errors errors = new ErrorsImpl01();
// テスト実施
validation.setErrors(errors);
// 判定
assertSame(errors, ReflectionTestUtils.getField(validation, "errors"));
}
/**
* testGetErrors01() <br>
* <br>
* (正常系) <br>
* 観点:C <br>
* <br>
* 入力値:(引数) なし:-<br>
* (状態) errors:Errorsインスタンス<br>
* <br>
* 期待値:(戻り値) Errors:Errorsインスタンス<br>
* <br>
* 属性に設定されている値を正常に取得すること。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetErrors01() throws Exception {
// 前処理
SpringValidationErrors validation = new SpringValidationErrors();
Errors errors = new ErrorsImpl01();
ReflectionTestUtils.setField(validation, "errors", errors);
// テスト実施
Errors result = validation.getErrors();
// 判定
assertSame(errors, result);
}
/**
* testAddErrors01() <br>
* <br>
* (正常系) <br>
* 観点:C <br>
* <br>
* 入力値:(引数) bean:Object<br>
* (引数) field:Fieldインスタンス<br>
* field.getKey()="key"<br>
* field.getMsg("name")="messageKey"<br>
* field.getArg("name", 0)="arg0"<br>
* field.getArg("name", 1)="arg1"<br>
* field.getArg("name", 2)="arg2"<br>
* field.getArg("name", 3)="arg3"<br>
* (引数) va:ValidationActionインスタンス<br>
* va.getName()="name"<br>
* <br>
* 期待値:(状態変化) rejectValue():呼び出し確認と引数の確認:<br>
* fieldCode="key"<br>
* errorCode="messageKey"<br>
* args={<br>
* MessageSourceResolvableインスタンス{<br>
* codes[0]={"arg0"}, arguments=null, defaultMessage="arg0"}, <br>
* MessageSourceResolvableインスタンス{<br>
* codes[1]={"arg1"}, arguments=null, defaultMessage="arg1"}, <br>
* MessageSourceResolvableインスタンス{<br>
* codes[2]={"arg2"}, arguments=null, defaultMessage="arg2"}, <br>
* MessageSourceResolvableインスタンス{<br>
* codes[3]={"arg3"}, arguments=null, defaultMessage="arg3"}, <br>
* }<br>
* <br>
* 引数がnot nullの場合 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testAddErrors01() throws Exception {
// 前処理
// 引数bean
Object bean = new Object();
// 引数field
Field field = new Field();
// field.getKey() : "key"
field.setKey("key");
// field.getMsg("name")の値を設定(errorCode取得のため)
FastHashMap hMsgs = new FastHashMap();
Msg msg = new Msg();
msg.setKey("messageKey");
hMsgs.put("name", msg);
ReflectionTestUtils.setField(field, "hMsgs", hMsgs);
// (Object[] args取得のため)
@SuppressWarnings("rawtypes")
Map[] args = new HashMap[4];
// args[0]
Arg arg = new Arg();
arg.setKey("arg0");
Map<String, Arg> hMap01 = new HashMap<String, Arg>();
hMap01.put("name", arg);
args[0] = hMap01;
// args[1]
arg = new Arg();
arg.setKey("arg1");
Map<String, Arg> hMap02 = new HashMap<String, Arg>();
hMap02.put("name", arg);
args[1] = hMap02;
// args[2]
arg = new Arg();
arg.setKey("arg2");
Map<String, Arg> hMap03 = new HashMap<String, Arg>();
hMap03.put("name", arg);
args[2] = hMap03;
// args[3]
arg = new Arg();
arg.setKey("arg3");
Map<String, Arg> hMap04 = new HashMap<String, Arg>();
hMap04.put("name", arg);
args[3] = hMap04;
ReflectionTestUtils.setField(field, "args", args);
// 引数va
ValidatorAction va = new ValidatorAction();
// va.getName : "name"
va.setName("name");
// SpringValidationErrorsインスタンス生成
SpringValidationErrors validation = new SpringValidationErrors();
// Errorsの設定 : ErrorsImpl01 - メソッドrejectValueと引数の呼出確認
ErrorsImpl01 errors = new ErrorsImpl01();
ReflectionTestUtils.setField(validation, "errors", errors);
// テスト実施
validation.addError(bean, field, va);
// 判定
ErrorsImpl01 assertErrors = (ErrorsImpl01) ReflectionTestUtils.getField(
validation, "errors");
// rejectValue呼出確認
assertTrue(assertErrors.isRejectValue);
// 引数field確認
assertEquals("key", assertErrors.field);
// 引数errorCode確認
assertEquals("messageKey", assertErrors.errorCode);
// assertSame(args, assertErrors.errorArgs);
// 引数errorArgs確認
Object[] objs = assertErrors.errorArgs;
MessageSourceResolvable msr = null;
for (int i = 0; i < objs.length; i++) {
msr = (MessageSourceResolvable) objs[i];
String[] strs = msr.getCodes();
// codes[0] : "arg" + i
assertEquals("arg" + i, strs[0]);
// arguments : null
assertNull(msr.getArguments());
// defaultMessage : "arg" + i
assertEquals("arg" + i, msr.getDefaultMessage());
}
// 引数defaultMessage確認
assertEquals("messageKey", assertErrors.defaultMessage);
}
}