/* * 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.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.BeanUtilsBean; import org.apache.commons.beanutils.PropertyUtilsBean; import uk.org.lidalia.slf4jtest.TestLogger; import uk.org.lidalia.slf4jtest.TestLoggerFactory; import static uk.org.lidalia.slf4jtest.LoggingEvent.trace; import static java.util.Arrays.asList; import static org.hamcrest.core.Is.*; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; /** * {@link jp.terasoluna.fw.GenericPropertyUtil} クラスのテスト。 * <p> * <h4>【クラスの概要】</h4> <code>JavaBean</code>のプロパティの<code>Generics</code>を扱うためのユーティリティクラス。 * <p> * @see jp.terasoluna.fw.util.GenericPropertyUtil */ public class GenericPropertyUtilTest { private TestLogger logger = TestLoggerFactory.getTestLogger( GenericPropertyUtil.class); /** * PropertyUtilsBean。 */ private PropertyUtilsBean defaultPropertyUtilsBean = null; /** * 初期化処理を行う。 */ @Before public void setUp() { BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance(); defaultPropertyUtilsBean = beanUtilsBean.getPropertyUtils(); } /** * 終了処理を行う。 * @throws Exception このメソッドで発生した例外 */ @After public void tearDown() throws Exception { BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance(); ReflectionTestUtils.setField(beanUtilsBean, "propertyUtilsBean", defaultPropertyUtilsBean); logger.clear(); } /** * testResolveCollectionType01() * <br><br> * (異常系)<br> * 観点:G <br> * <br> * 入力値:(引数) bean:null<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数beanがnullの場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType01() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType(null, null); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType02() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:Objectインスタンス<br> * (引数) name:null<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数nameがnullの場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType02() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType(new Object(), null); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType03() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:ObjectのClassインスタンス<br> * (引数) name:""(空文字)<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数nameが空文字の場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType03() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType(new Object(), ""); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType04() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:ObjectのClassインスタンス<br> * (引数) name:" "(空白文字列)<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数nameが空白文字列の場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType04() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType(new Object(), " "); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType05() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドList<String> list0を持つが、そのgetterを持たないクラス。<br> * (引数) name:"list0"<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 対応するメソッドが存在しない場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType05() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "list0"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType06() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドList<String> list1と、そのgetterを持つクラス。<br> * (引数) name:"list1"<br> * <br> * 期待値:(戻り値) Class:String.class<br> * <br> * 要素型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType06() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "list1"); // 判定 assertEquals(String.class, actual); } /** * testResolveCollectionType07() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドList<Map<String, Object>> list2と、そのgetterを持つクラス。<br> * (引数) name:"list2"<br> * <br> * 期待値:(戻り値) Class:Map.class<br> * <br> * パラメータ付の型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType07() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "list2"); // 判定 assertEquals(Map.class, actual); } /** * testResolveCollectionType08() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドList<String[]> list3と、そのgetterを持つクラス。<br> * (引数) name:"list3"<br> * <br> * 期待値:(戻り値) Class:String[].class<br> * <br> * 配列型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType08() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "list3"); // 判定 assertEquals(String[].class, actual); } /** * testResolveCollectionType09() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドint integerと、そのgetterを持つクラス。<br> * (引数) name:"integer"<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * <br> * 指定したプロパティがプリミティブ型の場合、IllegalStateExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType09() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "integer"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType10() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドObject objectと、そのgetterを持つクラス。<br> * (引数) name:"object"<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * <br> * 指定したプロパティがCollection以外の型の場合、IllegalStateExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType10() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "object"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveCollectionType11() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドList<? extends String> list5とそのgetterを持つクラス。<br> * (引数) name:"list5"<br> * <br> * 期待値:(戻り値) Class:Object.class<br> * <br> * 型パラメータ指定がワイルドカードの場合、Objectが返却されることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveCollectionType11() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveCollectionType( new GenericPropertyUtil_Stub01(), "list5"); // 判定 assertEquals(Object.class, actual); } /** * testResolveTypeObjectStringClassint01() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:null<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'bean' ("<br> * + Object.class.getName() + " is null"<br> * <br> * 引数beanがnullの場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint01() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(null, (String) null, null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'bean' (" + Object.class.getName() + " is null"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint02() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:Objectインスタンス<br> * (引数) name:null<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'name' ("<br> * + String.class.getName() + " is empty"<br> * <br> * 引数nameがnullの場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint02() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new Object(), (String) null, null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'name' (" + String.class.getName() + " is empty"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint03() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:Objectインスタンス<br> * (引数) name:""(空文字)<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'name' ("<br> * + String.class.getName() + " is empty"<br> * <br> * 引数nameが空文字の場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint03() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new Object(), "", null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'name' (" + String.class.getName() + " is empty"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint04() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:Objectインスタンス<br> * (引数) name:" "(空白文字列)<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'name' ("<br> * + String.class.getName() + " is empty"<br> * <br> * 引数nameが空白文字列の場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint04() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new Object(), " ", null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'name' (" + String.class.getName() + " is empty"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint05() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドMap<String, Object> map0を持つが、そのgetterを持たないクラス。<br> * (引数) name:"map0"<br> * (引数) genericClass:Map.class<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 対応するメソッドが存在しない場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint05() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "map0", Map.class, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint06() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドMap<String, Object> map1とそのgetterを持つクラス。<br> * (引数) name:"map1"<br> * (引数) genericClass:Map.class<br> * (引数) index:-1<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数indexが負の数である場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint06() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "map1", Map.class, -1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint07() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドMap<String, Object> map1とそのgetterを持つクラス。<br> * (引数) name:"map1"<br> * (引数) genericClass:Map.class<br> * (引数) index:0<br> * <br> * 期待値:(戻り値) Class:String.class<br> * <br> * 引数indexが型パラメータ数の範囲内である場合に型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint07() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType( new GenericPropertyUtil_Stub01(), "map1", Map.class, 0); // 判定 assertEquals(String.class, actual); } /** * testResolveTypeObjectStringClassint08() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドMap<String, Object> map1とそのgetterを持つクラス。<br> * (引数) name:"map1"<br> * (引数) genericClass:Map.class<br> * (引数) index:1<br> * <br> * 期待値:(戻り値) Class:Object.class<br> * <br> * 引数indexが型パラメータ数の範囲内である場合に型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint08() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType( new GenericPropertyUtil_Stub01(), "map1", Map.class, 0); // 判定 assertEquals(String.class, actual); } /** * testResolveTypeObjectStringClassint09() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドMap<String, Object> map1とそのgetterを持つクラス。<br> * (引数) name:"map1"<br> * (引数) genericClass:Map.class<br> * (引数) index:2<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数indexが型パラメータ数の範囲外である場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint09() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "map1", Map.class, 2); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint10() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドMap<String, Object> map1とそのgetterを持つクラス。<br> * (引数) name:"map1"<br> * (引数) genericClass:null<br> * (引数) index:1<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * <br> * 引数genericClassがnullである場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint10() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "map1", null, 1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint11() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドMap<String[], List<String>> map2とそのgetterを持つクラス。<br> * (引数) name:"map2"<br> * (引数) genericClass:Map.class<br> * (引数) index:0<br> * <br> * 期待値:(戻り値) Class:String[].class<br> * <br> * 配列型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint11() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType( new GenericPropertyUtil_Stub01(), "map2", Map.class, 0); // 判定 assertEquals(String[].class, actual); } /** * testResolveTypeObjectStringClassint12() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドMap<String[], List<String>> map2とそのgetterを持つクラス。<br> * (引数) name:"map2"<br> * (引数) genericClass:Map.class<br> * (引数) index:1<br> * <br> * 期待値:(戻り値) Class:List.class<br> * <br> * パラメータ付の型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint12() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType( new GenericPropertyUtil_Stub01(), "map2", Map.class, 1); // 判定 assertEquals(List.class, actual); } /** * testResolveTypeObjectStringClassint13() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドMap<String[], List<String>> map2とそのgetterを持つクラス。<br> * (引数) name:"map2"<br> * (引数) genericClass:String.class<br> * (引数) index:1<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * <br> * genericClassがフィールドの型と合致しない場合、 IllegalStateExceptionがスローされることを確認するテスト。。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint13() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "map2", String.class, 1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint14() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドいint integerとそのgetterを持つクラス。<br> * (引数) name:"integer"<br> * (引数) genericClass:int.class<br> * (引数) index:1<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * メッセージ:"No parameterizedType was detected."<br> * <br> * 指定したプロパティがプリミティブ型の場合、 IllegalStateExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint14() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "integer", int.class, 1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { assertEquals("No parameterizedType was detected.", e.getMessage()); assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint15() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドいObject objectとそのgetterを持つクラス。<br> * (引数) name:"object"<br> * (引数) genericClass:Object.class<br> * (引数) index:1<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * メッセージ:"No parameterizedType was detected."<br> * <br> * 指定したプロパティがオブジェクト型の場合、 IllegalStateExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint15() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(new GenericPropertyUtil_Stub01(), "object", Object.class, 1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { assertEquals("No parameterizedType was detected.", e.getMessage()); assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeObjectStringClassint16() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドMap<?, ?> map3とそのgetterを持つクラス。<br> * (引数) name:"map3"<br> * (引数) genericClass:Map.class<br> * (引数) index:1<br> * <br> * 期待値:(戻り値) Class:Object.class<br> * <br> * 型パラメータ指定がワイルドカードの場合、Objectが返却されることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeObjectStringClassint16() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType( new GenericPropertyUtil_Stub01(), "map3", Map.class, 0); // 判定 assertEquals(Object.class, actual); } /** * testGetMethod01() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドString string、getter, setterを持たないクラス。<br> * (引数) name:"string"<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:beanの完全修飾クラス名 + " has no getter for property string"<br> * <br> * 対応するフィールドが存在しない場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetMethod01() throws Exception { try { // テスト実施 GenericPropertyUtil.getMethod(new GenericPropertyUtil_Stub02(), "string"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = GenericPropertyUtil_Stub02.class.getName() + " has no getter for property string"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testGetMethod02() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドString string1を持つが、そのgetterを持たないクラス。<br> * (引数) name:"string1"<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:beanの完全修飾クラス名 + " has no getter for property string1"<br> * <br> * 対応するメソッドが存在しない場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetMethod02() throws Exception { try { // テスト実施 GenericPropertyUtil.getMethod(new GenericPropertyUtil_Stub02(), "string1"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = GenericPropertyUtil_Stub02.class.getName() + " has no getter for property string1"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testGetMethod03() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) bean:フィールドString string2とそのgetterを持つクラス。<br> * (引数) name:"string2"<br> * <br> * 期待値:(戻り値) Method:beanのgetString2メソッド<br> * <br> * 対応するメソッドが返却されることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetMethod03() throws Exception { // テスト実施 Method actual = GenericPropertyUtil.getMethod( new GenericPropertyUtil_Stub02(), "string2"); // 判定 Method expected = GenericPropertyUtil_Stub02.class.getDeclaredMethod( "getString2", new Class[0]); assertEquals(expected, actual); } /** * testGetMethod04() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドbean1を持つが、そのgetterを持たないクラス。<br> * (引数) name:"bean1.string"<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Failed to detect getter for "<br> * + beanの完全修飾クラス名 + "#bean1.string"<br> * ラップされた例外:NoSuchMethodException<br> * <br> * PropertyUtils#getPropertyDescriptorでNoSuchMethodExceptionがスローされる場合のテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetMethod04() throws Exception { try { // テスト実施 GenericPropertyUtil.getMethod(new GenericPropertyUtil_Stub02(), "bean1.string"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Failed to detect getter for " + GenericPropertyUtil_Stub02.class.getName() + "#bean1.string"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); assertTrue(e.getCause() instanceof NoSuchMethodException); } } /** * testGetMethod05() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドbean2とそのgetterを持つクラス。<br> * (getterではRuntimeExceptionがスローされる)<br> * (引数) name:"bean2.string"<br> * (状態) PropertyUtils#getPropertyDescriptorの実行結果: InvocationTargetExceptionをスロー ※JavaBeanのgetterでRuntimeExceptionをスロー<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Failed to detect getter for "<br> * + beanの完全修飾クラス名 + "#bean2.string"<br> * ラップされた例外:InvocationTargetException<br> * <br> * PropertyUtils#getPropertyDescriptorでInvocationTargetExceptionがスローされる場合のテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetMethod05() throws Exception { try { // テスト実施 GenericPropertyUtil.getMethod(new GenericPropertyUtil_Stub02(), "bean2.string"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Failed to detect getter for " + GenericPropertyUtil_Stub02.class.getName() + "#bean2.string"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); assertTrue(e.getCause() instanceof InvocationTargetException); } } /** * testGetMethod06() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) bean:フィールドString string2とそのgetterを持つクラス。<br> * (引数) name:"string2"<br> * (状態) PropertyUtils#getPropertyDescriptorの実行結果: IllegalAccessExceptionをスロー * ※PropertyUtilsBeanのスタブでIllegalAccessExceptionをスロー<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Failed to detect getter for "<br> * + beanの完全修飾クラス名 + "#string2"<br> * ラップされた例外:IllegalAccessException<br> * <br> * PropertyUtils#getPropertyDescriptorでIllegalAccessExceptionがスローされる場合のテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetMethod06() throws Exception { // 前処理 BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance(); ReflectionTestUtils.setField(beanUtilsBean, "propertyUtilsBean", new GenericPropertyUtil_PropertyUtilsBeanStub01()); try { // テスト実施 GenericPropertyUtil.getMethod(new GenericPropertyUtil_Stub02(), "string2"); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Failed to detect getter for " + GenericPropertyUtil_Stub02.class.getName() + "#string2"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); assertTrue(e.getCause() instanceof IllegalAccessException); } } /** * testResolveTypeClassClassTypeint01() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) genericClass:null<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'genericsClass' ("<br> * + Class.class.getName() + ") is null"<br> * <br> * 引数genericClassがnullの場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint01() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType((Class<?>) null, (Class<?>) null, null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'genericsClass' (" + Class.class .getName() + ") is null"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeClassClassTypeint02() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:null<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * メッセージ:genericClass+ " is not assignable from " + clazz<br> * <br> * 引数clazzがnullの場合にIllegalStateExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint02() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(List.class, (Class<?>) null, null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { String message = List.class + " is not assignable from " + "null"; assertEquals(message, e.getMessage()); assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeClassClassTypeint03() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:Object.class<br> * (引数) index:0<br> * <br> * 期待値:(状態変化) 例外:IllegalStateException<br> * メッセージ:genericClass+ " is not assignable from " + clazz<br> * <br> * 引数clazzがgenericClassのサブクラスではない場合にIllegalStateExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint03() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(List.class, Object.class, null, 0); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalStateException e) { String message = List.class + " is not assignable from " + Object.class; assertEquals(message, e.getMessage()); assertEquals(IllegalStateException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeClassClassTypeint04() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:ArrayList継承クラス(パラメータにStringを指定)<br> * (引数) type:null<br> * (引数) index:-1<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'index'(-1) is out of bounds of"<br> * + " generics parameters")<br> * <br> * 引数indexが負の数である場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint04() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(List.class, GenericPropertyUtil_ArrayListStub01.class, null, -1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'index'(-1) is out of bounds of" + " generics parameters"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeClassClassTypeint05() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:ArrayList継承クラス(パラメータにStringを指定)<br> * (引数) type:null<br> * (引数) index:0<br> * <br> * 期待値:(戻り値) Class:String.class<br> * <br> * 引数indexが型パラメータ数の範囲内である場合に型が取得できることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint05() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType(List.class, GenericPropertyUtil_ArrayListStub01.class, null, 0); // 判定 assertEquals(String.class, actual); } /** * testResolveTypeClassClassTypeint06() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:ArrayList継承クラス(パラメータにStringを指定)<br> * (引数) type:null<br> * (引数) index:1<br> * <br> * 期待値:(状態変化) 例外:IllegalArgumentException<br> * メッセージ:"Argument 'index'(1) is out of bounds of"<br> * + " generics parameters")<br> * <br> * 引数indexが型パラメータ数の範囲外である場合にIllegalArgumentExceptionがスローされることを確認するテスト。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint06() throws Exception { try { // テスト実施 GenericPropertyUtil.resolveType(List.class, GenericPropertyUtil_ArrayListStub01.class, null, 1); // 判定 fail("例外がスローされませんでした。"); } catch (IllegalArgumentException e) { String message = "Argument 'index'(1) is out of bounds of" + " generics parameters"; assertEquals(message, e.getMessage()); assertEquals(IllegalArgumentException.class.getName(), e.getClass() .getName()); } } /** * testResolveTypeClassClassTypeint07() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:ArrayList.class<br> * (引数) type:List.class<br> * (引数) index:0<br> * <br> * 期待値:(戻り値) Class:Object.class<br> * (状態変化) ログ出力:<br> * ログレベル:TRACE メッセージ:"Concrete type of Type(E) was not found in ancestorList([java.util.AbstractList<E>, java.util.List * <E>])"<br> * <br> * 型が特定できない場合にObjectが返却されることを確認するテスト。 (経路確認のために特別にトレースログをチェックする) <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint07() throws Exception { // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType(List.class, ArrayList.class, List.class, 0); // 判定 assertEquals(Object.class, actual); assertThat(logger.getLoggingEvents(), is(asList(trace( "Concrete type of Type(E) was " + "not found in ancestorList([java.util.AbstractList<E>, " + "java.util.List<E>])")))); } /** * testResolveTypeClassClassTypeint08() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) genericClass:List.class<br> * (引数) clazz:ArrayList.class<br> * (引数) type:List<String>を表すParameterizedType<br> * (引数) index:0<br> * <br> * 期待値:(戻り値) Class:String.class<br> * (状態変化) ログ出力:<br> * ログレベル:TRACE メッセージ:"Argument 'genericClass'(java.util.List) does not declare type parameter"<br> * <br> * typeで型が特定される場合に、型パラメータが返却されることを確認するテスト。 (経路確認のために特別にトレースログをチェックする) <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testResolveTypeClassClassTypeint08() throws Exception { // 前処理 Method method = GenericPropertyUtil_Stub01.class.getMethod("getList1", new Class[0]); Type type = method.getGenericReturnType(); // テスト実施 Class<?> actual = GenericPropertyUtil.resolveType(List.class, List.class, type, 0); // 判定 assertEquals(String.class, actual); assertThat(logger.getLoggingEvents(), is(asList(trace("Argument " + "'genericClass'(java.util.List) does not " + "declare type parameter")))); } }