package jp.terasoluna.fw.file.dao.standard; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.concurrent.ConcurrentHashMap; import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; /** * {@link jp.terasoluna.fw.file.dao.standard.DecimalColumnFormatter} クラスのテスト。 * <p> * <h4>【クラスの概要】</h4> アノテーションcolumnFormatの記述に従い、文字列の変換処理を行う。 * <p> * @see jp.terasoluna.fw.file.dao.standard.DecimalColumnFormatter */ @RunWith(PowerMockRunner.class) @PrepareForTest(DecimalColumnFormatter.class) public class DecimalColumnFormatterTest { /** * testFormat01() <br> * <br> * (正常系) <br> * 観点:C,E <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal01<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:null<br> * <br> * 期待値:(戻り値) 文字列:"1000000"<br> * <br> * 正常ケース<br> * フォーマット用の文字列がnullの場合、 かつフィールドのgetterメソッドが正しく設定されている場合に、 対象フィールドの情報が数字のみの文字列(BigDecimal.toPlainString()の結果) * として取得されることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat01() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal01(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal01"); String columnFormat = null; // テスト実施 String result = decimalColumnFormatter.format(stub, method, columnFormat); // 判定 assertNotNull(result); assertEquals("1000000", result); } /** * testFormat02() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal02<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:"\\##,###,###.00"<br> * <br> * 期待値:(戻り値) 文字列:"\\1,000,000.00"<br> * <br> * 正常ケース<br> * フォーマット用の文字列が正しく設定された場合、 かつフィールドのgetterメソッドが正しく設定されている場合に、 対象フィールドの情報がフォーマットに従った文字列として取得されることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat02() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal02(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal02"); String columnFormat = "\\##,###,###.00"; // テスト実施 String result = decimalColumnFormatter.format(stub, method, columnFormat); // 判定 assertNotNull(result); assertEquals("\\1,000,000.00", result); } /** * testFormat03() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal03<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:private<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:"\\##,###,###.00"<br> * <br> * 期待値:(状態変化) -:IllegalAccessExceptionが発生することを確認する。<br> * <br> * 異常ケース<br> * フィールドのgetterメソッドがprivateで宣言された場合、 IllegalAccessExceptionが発生することを確認する <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat03() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal03(new BigDecimal(1000000)); Method method = stub.getClass().getDeclaredMethod("getDecimal03"); String columnFormat = "\\##,###,###.00"; // テスト実施 try { decimalColumnFormatter.format(stub, method, columnFormat); fail("IllegalAccessExceptionが発生しませんでした。"); } catch (IllegalAccessException e) { // 判定 assertTrue(e instanceof IllegalAccessException); } } /** * testFormat04() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal04<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:例外が発生する。<br> * (引数) columnFormat:"\\##,###,###.00"<br> * <br> * 期待値:(状態変化) -:InvocationTargetExceptionが発生することを確認する。<br> * <br> * 異常ケース<br> * フィールドのgetterメソッド処理中例外が発生した場合、 InvocationTargetExceptionが発生することを確認する <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat04() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal04(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal04"); String columnFormat = "\\##,###,###.00"; // テスト実施 try { decimalColumnFormatter.format(stub, method, columnFormat); fail("InvocationTargetExceptionが発生しませんでした。"); } catch (InvocationTargetException e) { // 判定 assertTrue(e instanceof InvocationTargetException); } } /** * testFormat05() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal05<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:ある<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:new String()<br> * <br> * 期待値:(状態変化) -:IllegalArgumentExceptionが発生することを確認する。<br> * <br> * 異常ケース<br> * フィールドのgetterメソッドとして引数なしのメソッドが存在しない場合、 IllegalArgumentExceptionが発生することを確認する <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat05() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal05(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal05", new Class[] { BigDecimal.class }); String columnFormat = new String(); // テスト実施 try { decimalColumnFormatter.format(stub, method, columnFormat); fail("IllegalArgumentExceptionが発生しませんでした。"); } catch (IllegalArgumentException e) { // 判定 assertTrue(e instanceof IllegalArgumentException); } } /** * testFormat06() <br> * <br> * (正常系) <br> * 観点:C,E <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal06<br> * - 型:BigDecimal<br> * - 設定値:null<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:null<br> * <br> * 期待値:(戻り値) 文字列:""<br> * <br> * 正常ケース<br> * ファイル行オブジェクトのフィールド値がnullの場合、空文字が取得されることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat06() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal06(null); Method method = stub.getClass().getMethod("getDecimal06"); String columnFormat = null; // テスト実施 String result = decimalColumnFormatter.format(stub, method, columnFormat); // 判定 assertNotNull(result); assertEquals("", result); } /** * testFormat07() <br> * <br> * (正常系) <br> * 観点:C,E <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal07<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:""<br> * <br> * 期待値:(戻り値) 文字列:"1000000"<br> * <br> * 正常ケース<br> * フォーマット用の文字列が空文字の場合、かつフィールドのgetterメソッドが 正しく設定されている場合に、対象フィールドの情報が数字のみの文字列 (BigDecimal.toPlainString()の結果)として取得されることを確認する。 * <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat07() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal07(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal07"); String columnFormat = ""; // テスト実施 String result = decimalColumnFormatter.format(stub, method, columnFormat); // 判定 assertNotNull(result); assertEquals("1000000", result); } /** * testFormat08() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal08<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:"\\##,###,###.00"<br> * (状態) dfMap:要素を持たないConcurrentHashMapインスタンス<br> * <br> * 期待値:(戻り値) 文字列:"\\1,000,000.00"<br> * (状態変化) dfMap:以下の要素を持つConcurrentHashMapインスタンス<br> * ・key:"\\##,###,###.00"<br> * value:キーに対するDecimalFormatLocalインスタンス<br> * (状態変化) DecimalFormatLocal#<init>:1回呼ばれる<br> * <br> * 正常ケース<br> * フォーマット用の文字列に対するDecimalFormatLocalがキャッシュに存在しない場合、 問題なく実行されることを確認する。<br> * また、新しく生成されたフォーマット用の文字列に対する DecimalFormatLocalがキャッシュされることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat08() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal08(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal08"); String columnFormat = "\\##,###,###.00"; ConcurrentHashMap<String, DecimalFormatLocal> dfMap = new ConcurrentHashMap<String, DecimalFormatLocal>(); ReflectionTestUtils.setField(decimalColumnFormatter, "dfMap", dfMap); dfMap.clear(); DecimalFormatLocal dfl = Mockito.spy( new DecimalFormatLocal(columnFormat)); PowerMockito.whenNew(DecimalFormatLocal.class).withArguments( columnFormat).thenReturn(dfl); // テスト実施 String result = decimalColumnFormatter.format(stub, method, columnFormat); // 判定 assertNotNull(result); assertEquals("\\1,000,000.00", result); assertSame(dfMap, ReflectionTestUtils.getField(decimalColumnFormatter, "dfMap")); assertEquals(1, dfMap.size()); assertTrue(dfMap.containsKey(columnFormat)); DecimalFormatLocal dfMapValue = dfMap.get(columnFormat); assertNotNull(dfMapValue); assertEquals(columnFormat, ReflectionTestUtils.getField(dfMapValue, "pattern")); PowerMockito.verifyNew(DecimalFormatLocal.class).withArguments( columnFormat); } /** * testFormat09() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) t:以下の情報をObjectインスタンス<br> * ・フィールド<br> * - フィールド名:decimal09<br> * - 型:BigDecimal<br> * - 設定値:new BigDecimal(1000000)<br> * ・メソッド<br> * - フィールドに対するgetter、setterメソッドが存在する。<br> * ※getterメソッドの定義は引数methodの記述に従う。<br> * (引数) method:対象フィールドに対するgetterメソッドのインスタンス<br> * ・可視性:public<br> * ・引数:なし<br> * ・処理:対象フィールの情報を返す。<br> * (引数) columnFormat:"\\##,###,###.00"<br> * (状態) dfMap:以下の要素を持つConcurrentHashMapインスタンス<br> * ・key:"\\##,###,###.00"<br> * value:キーに対するDecimalFormatLocalインスタンス<br> * <br> * 期待値:(戻り値) 文字列:"\\1,000,000.00"<br> * (状態変化) dfMap:以下の要素を持つConcurrentHashMapインスタンス<br> * ・key:"\\##,###,###.00"<br> * value:キーに対するDecimalFormatLocalインスタンス<br> * (状態変化) DecimalFormatLocal#<init>:呼ばれない<br> * <br> * 正常ケース<br> * フォーマット用の文字列に対するDecimalFormatLocalがキャッシュに存在する場合、 問題なく実行されることを確認する。<br> * また、フォーマット用の文字列に対するDecimalFormatLocalが新しく生成されないことを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testFormat09() throws Exception { // 前処理 DecimalColumnFormatter decimalColumnFormatter = new DecimalColumnFormatter(); // 前処理(引数) DecimalColumnFormatter_FileLineObjectStub01 stub = new DecimalColumnFormatter_FileLineObjectStub01(); stub.setDecimal09(new BigDecimal(1000000)); Method method = stub.getClass().getMethod("getDecimal09"); String columnFormat = "\\##,###,###.00"; ConcurrentHashMap<String, DecimalFormatLocal> dfMap = new ConcurrentHashMap<String, DecimalFormatLocal>(); DecimalFormatLocal dfMapValue = Mockito.spy( new DecimalFormatLocal(columnFormat)); dfMap.put(columnFormat, dfMapValue); ReflectionTestUtils.setField(decimalColumnFormatter, "dfMap", dfMap); PowerMockito.whenNew(DecimalFormatLocal.class).withArguments( columnFormat).thenReturn(dfMapValue); // テスト実施 String result = decimalColumnFormatter.format(stub, method, columnFormat); // 判定 assertNotNull(result); assertEquals("\\1,000,000.00", result); assertSame(dfMap, ReflectionTestUtils.getField(decimalColumnFormatter, "dfMap")); assertEquals(1, dfMap.size()); assertTrue(dfMap.containsKey(columnFormat)); DecimalFormatLocal formatLocal = dfMap.get(columnFormat); assertSame(dfMapValue, formatLocal); PowerMockito.verifyNew(DecimalFormatLocal.class, Mockito.never()) .withArguments(columnFormat); } }