package jp.terasoluna.fw.file.dao.standard; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; import jp.terasoluna.fw.file.annotation.NullStringConverter; import jp.terasoluna.fw.file.dao.FileException; import org.mockito.Mockito; /** * {@link jp.terasoluna.fw.file.dao.standard.CSVFileLineIterator} クラスのテスト。 * <p> * <h4>【クラスの概要】</h4> CSVファイル用のファイルアクセス(データ取得)クラス。 * <p> * @see jp.terasoluna.fw.file.dao.standard.CSVFileLineIterator */ public class CSVFileLineIteratorTest { /** * testCSVFileLineIterator01() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) fileName:CSVFileLineIterator01.txt<br> * データを持たないファイルのパス<br> * (引数) clazz:以下の設定を持つFileFormatアノテーションを持つスタブ<br> * CSVFileLineIterator_Stub02<br> * アノテーションFileFormat:encloseChar(囲み文字)が初期値以外<br> * @FileFormat(encloseChar = '"')<br> * (引数) columnParserMap:以下の設定を持つHashMapのインスタンス<br> * 要素1<br> * key:"java.lang.String"<br> * value:ColumnParserインスタンス<br> * CSVFileLineIterator_ColumnParserStub01インスタンス<br> * 空実装<br> * <br> * 期待値:(状態変化) AbstractFileLineIteratorコンストラクタ:1回呼ばれ、引数がすべて渡っていること。<br> * (状態変化) encloseChar:初期値以外(設定したもの)<br> * (状態変化) AbstractFileLineIterator#init():2回呼ばれる。<br> * <br> * 正常パターン<br> * コンストラクタの呼出が正常に行われることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testCSVFileLineIterator01() throws Exception { // テスト対象のインスタンス化なし // 引数の設定 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub02> clazz = CSVFileLineIterator_Stub02.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); // 前提条件なし // テスト実施 CSVFileLineIterator<?> csvFileLineIterator = Mockito.spy( new CSVFileLineIterator<CSVFileLineIterator_Stub02>(fileName, clazz, columnParserMap)); // 返却値なし // 状態変化の確認 assertEquals(fileName, ReflectionTestUtils.getField(csvFileLineIterator, "fileName")); assertEquals(clazz, ReflectionTestUtils.getField(csvFileLineIterator, "clazz")); assertSame(columnParserMap, ReflectionTestUtils.getField( csvFileLineIterator, "columnParserMap")); assertEquals('"', csvFileLineIterator.getEncloseChar()); } /** * testCSVFileLineIterator02() <br> * <br> * (異常系) <br> * 観点:G <br> * <br> * 入力値:(引数) fileName:CSVFileLineIterator01.txt<br> * データを持たないファイルのパス<br> * (引数) clazz:以下の設定を持つFileFormatアノテーションを持つスタブ<br> * CSVFileLineIterator_Stub03<br> * アノテーションFileFormat:delimiter(区切り文字)が初期値以外<br> * @FileFormat(delimiter = '"')<br> * (引数) columnParserMap:以下の設定を持つHashMapのインスタンス<br> * 要素1<br> * key:"java.lang.String"<br> * value:ColumnParserインスタンス<br> * CSVFileLineIterator_ColumnParserStub01インスタンス<br> * 空実装<br> * <br> * 期待値:(状態変化) AbstractFileLineIteratorコンストラクタ:1回呼ばれる。<br> * 引数と同じインスタンスが渡される。<br> * (状態変化) AbstractFileLineIterator#init():呼ばれない。<br> * (状態変化) なし:"Delimiter can not change."のメッセージ、IllegalStateException、ファイル名を持つFileExceptionが発生する。<br> * <br> * 例外。@FileFormatのdelimiterに初期値以外を設定した場合、例外が発生することを確認する。<br> * ファイル名が入力値のfileNameに一致することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testCSVFileLineIterator02() throws Exception { // テスト対象のインスタンス化なし // 引数の設定 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub03> clazz = CSVFileLineIterator_Stub03.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); // 前提条件なし // テスト実施 try { new CSVFileLineIterator<CSVFileLineIterator_Stub03>(fileName, clazz, columnParserMap); fail("FileExceptionがスローされませんでした。"); } catch (FileException e) { // 返却値なし // 状態変化の確認 assertEquals("Delimiter can not change.", e.getMessage()); assertEquals(fileName, e.getFileName()); assertEquals(IllegalStateException.class, e.getCause().getClass()); } } /** * testCSVFileLineIterator03() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) fileName:CSVFileLineIterator01.txt<br> * データを持たないファイルのパス<br> * (引数) clazz:以下の設定を持つFileFormatアノテーションを持つスタブ<br> * CSVFileLineIterator_Stub01<br> * アノテーションFileFormat:初期値<br> * @FileFormat()<br> * (引数) columnParserMap:以下の設定を持つHashMapのインスタンス<br> * 要素1<br> * key:"java.lang.String"<br> * value:ColumnParserインスタンス<br> * CSVFileLineIterator_ColumnParserStub01インスタンス<br> * 空実装<br> * <br> * 期待値:(状態変化) AbstractFileLineIteratorコンストラクタ:1回呼ばれ、引数がすべて渡っていること。<br> * (状態変化) encloseChar:初期値が設定されていること。<br> * <br> * 引数clazzに設定されたクラスが囲み文字、区切り文字がデフォルトのままの場合は、コンストラクタ呼び出しが正常に行われることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testCSVFileLineIterator03() throws Exception { // テスト対象のインスタンス化なし // 引数の設定 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); // 前提条件なし // テスト実施 CSVFileLineIterator<?> csvFileLineIterator = Mockito.spy( new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap)); // 返却値なし // 状態変化の確認 assertEquals(fileName, ReflectionTestUtils.getField(csvFileLineIterator, "fileName")); assertEquals(clazz, ReflectionTestUtils.getField(csvFileLineIterator, "clazz")); assertSame(columnParserMap, ReflectionTestUtils.getField( csvFileLineIterator, "columnParserMap")); assertEquals(Character.MIN_VALUE, csvFileLineIterator.getEncloseChar()); } /** * 異常系<br> * ファイル行オブジェクトにInputFileColumnアノテーションが無し * @throws Exception このメソッドで発生した例外 */ @Test public void testCSVFileLineIterator04() throws Exception { // 引数の設定 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<FileLineObject_Empty> clazz = FileLineObject_Empty.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); // テスト実施 try { new CSVFileLineIterator<FileLineObject_Empty>(fileName, clazz, columnParserMap); fail("FileExceptionがスローされませんでした。"); } catch (FileException e) { // 返却値なし // 状態変化の確認 assertEquals("InputFileColumn is not found.", e.getMessage()); assertEquals(fileName, e.getFileName()); assertEquals(IllegalStateException.class, e.getCause().getClass()); } } /** * testSeparateColumns01() <br> * <br> * (正常系) <br> * 観点:C <br> * <br> * 入力値:(引数) fileLineString:null<br> * (状態) this.encloseChar:Character.MIN_VALUE<br> * <br> * 期待値:(戻り値) String[]:new String[0]<br> * <br> * 正常パターン。<br> * nullもしくは空文字が引数として渡された場合、要素数0の配列を返却することを確認する。<br> * 通常の処理でこの返却値が戻ることはない。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns01() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub01> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = null; // 前提条件 ReflectionTestUtils.setField(csvFileLineIterator, "columnEncloseChar", new char[] {}); // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(0, result.length); // 状態変化なし } /** * testSeparateColumns02() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) fileLineString:"aaa"<br> * (状態) this.encloseChar:Character.MIN_VALUE<br> * <br> * 期待値:(戻り値) String[]:{"aaa"}<br> * <br> * 正常パターン。(囲み文字がない場合の処理)<br> * 要素数1の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns02() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub01> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "aaa"; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(1, result.length); assertEquals(fileLineString, result[0]); } /** * testSeparateColumns03() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) fileLineString:"aaa,bbb,ccc"<br> * (状態) this.encloseChar:Character.MIN_VALUE<br> * <br> * 期待値:(戻り値) String[]:{"aaa","bbb","ccc"}<br> * <br> * 正常パターン。(囲み文字がない場合の処理)<br> * 要素数3の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns03() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub01> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "aaa,bbb,ccc"; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(3, result.length); assertEquals("aaa", result[0]); assertEquals("bbb", result[1]); assertEquals("ccc", result[2]); // 状態変化なし } /** * testSeparateColumns04() <br> * <br> * (正常系) <br> * 観点:E, F <br> * <br> * 入力値:(引数) fileLineString:"\"aaa\""<br> * (状態) this.encloseChar:\"'<br> * (状態) this.fields[]:配列要素が0<br> * <br> * 期待値:(戻り値) String[]:{"aaa"}<br> * <br> * 正常パターン。(囲み文字がある場合の処理)<br> * 囲み文字がエスケープされ、要素数1の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns04() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub02> clazz = CSVFileLineIterator_Stub02.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub02> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub02>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "\"aaa\""; // 前提条件 ReflectionTestUtils.setField(csvFileLineIterator, "columnEncloseChar", new char[] { '\"', '\"' }); // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(1, result.length); assertEquals("aaa", result[0]); } /** * testSeparateColumns05() <br> * <br> * (正常系) <br> * 観点:E <br> * <br> * 入力値:(引数) fileLineString:"\"aaa\""<br> * (状態) this.encloseChar:\"<br> * (状態) this.fields[]:配列要素が1<br> * (状態) this.field[]のアノテーションInputFileColumn:@InputFileColumn(columnIndex = 0)<br> * private String column1 = null;<br> * <br> * 期待値:(戻り値) String[]:{"aaa"}<br> * <br> * 正常パターン。(囲み文字がない場合の処理)<br> * 要素数1の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns05() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub04> clazz = CSVFileLineIterator_Stub04.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub04> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub04>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "\"aaa\""; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(1, result.length); assertEquals("aaa", result[0]); } /** * testSeparateColumns06() <br> * <br> * (正常系) <br> * 観点:E, F <br> * <br> * 入力値:(引数) fileLineString:"\"aaa\",\"bbb\",\"ccc\""<br> * (状態) this.encloseChar:\"'<br> * (状態) this.fields[]:配列要素が3<br> * (状態) this.field[]のアノテーションInputFileColumn:@InputFileColumn(columnIndex = 0)<br> * private String column1 = null;<br> * <br> * @InputFileColumn(columnIndex = 1)<br> * private String column2 = null;<br> * <br> * @InputFileColumn(columnIndex = 2)<br> * private String column3 = null;<br> * <br> * 期待値:(戻り値) String[]:{"aaa","bbb","ccc"}<br> * <br> * 正常パターン。(囲み文字がある場合の処理。)<br> * 囲み文字がエスケープされ、要素数3の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns06() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub05> clazz = CSVFileLineIterator_Stub05.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub05> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub05>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "\"aaa\",\"bbb\",\"ccc\""; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(3, result.length); assertEquals("aaa", result[0]); assertEquals("bbb", result[1]); assertEquals("ccc", result[2]); // 状態変化なし } /** * testSeparateColumns07() <br> * <br> * (正常系) <br> * 観点:E, F <br> * <br> * 入力値:(引数) fileLineString:"\"aa\ra\",\"bb,b\",\"cc\"\"c\""<br> * 囲み文字あり、<br> * 行区切り文字が含まれる、<br> * 区切り文字が含まれる、<br> * 囲み文字が含まれる場合<br> * (状態) this.encloseChar:\"'<br> * (状態) this.fields[]:配列要素が3<br> * (状態) this.field[]のアノテーションInputFileColumn:@InputFileColumn(columnIndex = 0)<br> * private String column1 = null;<br> * <br> * @InputFileColumn(columnIndex = 1)<br> * private String column2 = null;<br> * <br> * @InputFileColumn(columnIndex = 2)<br> * private String column3 = null;<br> * <br> * 期待値:(戻り値) String[]:{"aa\ra","bb,b","cc\"c"}<br> * <br> * 正常パターン。(囲み文字がある場合の処理。)<br> * 要素数3の配列を返却することを確認する。<br> * 区切り文字、囲み文字がそれぞれエスケープされることを確認する。行区切り文字はエスケープされないことを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns07() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub05> clazz = CSVFileLineIterator_Stub05.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub05> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub05>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "\"aa\ra\",\"bb,b\",\"cc\"\"c\""; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(3, result.length); assertEquals("aa\ra", result[0]); assertEquals("bb,b", result[1]); assertEquals("cc\"c", result[2]); // 状態変化なし } /** * testSeparateColumns08() <br> * <br> * (正常系) <br> * 観点:E, F <br> * <br> * 入力値:(引数) fileLineString:"aaa,bbb,ccc"<br> * (状態) this.encloseChar:\"'<br> * <br> * 期待値:(戻り値) String[]:{"aaa","bbb","ccc"}<br> * <br> * 正常パターン。(encloseCharが設定されており、囲み文字がない場合の処理)<br> * 要素数3の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns08() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub02> clazz = CSVFileLineIterator_Stub02.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub02> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub02>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "aaa,bbb,ccc"; // 前提条件 ReflectionTestUtils.setField(csvFileLineIterator, "columnEncloseChar", new char[] { Character.MIN_VALUE, Character.MIN_VALUE, Character.MIN_VALUE }); // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(3, result.length); assertEquals("aaa", result[0]); assertEquals("bbb", result[1]); assertEquals("ccc", result[2]); // 状態変化なし } /** * testSeparateColumns09() <br> * <br> * (正常系) <br> * 観点:C <br> * <br> * 入力値:(引数) fileLineString:,,,,<br> * (状態) this.encloseChar:Character.MIN_VALUE<br> * <br> * 期待値:(戻り値) String[]:{"", "", "", "", ""}<br> * <br> * 正常パターン。(囲み文字がない場合の処理)<br> * 空白文字5の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns09() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub01> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = ",,,,"; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(5, result.length); assertEquals("", result[0]); assertEquals("", result[1]); assertEquals("", result[2]); assertEquals("", result[3]); assertEquals("", result[4]); // 状態変化なし } /** * testSeparateColumns10() <br> * <br> * (正常系) <br> * 観点:C <br> * <br> * 入力値:(引数) fileLineString:""(空文字)<br> * (状態) this.encloseChar:Character.MIN_VALUE<br> * <br> * 期待値:(戻り値) String[]:new String[0]<br> * <br> * 空文字が引数として渡された場合、要素数0の配列を返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns10() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub01> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = ""; // 前提条件(インスタンス化で設定される) // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(0, result.length); // 状態変化なし } /** * testSeparateColumns11() <br> * <br> * (正常系) <br> * 観点:E, F <br> * <br> * 入力値:(引数) fileLineString:"\"aa\"bb\""<br> * (状態) this.encloseChar:\"'<br> * <br> * 期待値:(戻り値) String[]:{"aabb\""}<br> * <br> * 囲み文字が設定されており、エスケープされていない囲み文字が内部データとして格納されている場合は、予期せぬデータが返却されることを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testSeparateColumns11() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub02> clazz = CSVFileLineIterator_Stub02.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub02> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub02>(fileName, clazz, columnParserMap); // 引数の設定 String fileLineString = "\"aa\"bb\""; // 前提条件 ReflectionTestUtils.setField(csvFileLineIterator, "columnEncloseChar", new char[] { '\"', '\"', '\"' }); // テスト実施 String[] result = csvFileLineIterator.separateColumns(fileLineString); // 返却値の確認 assertEquals(1, result.length); assertEquals("aabb\"", result[0]); // 状態変化なし } /** * testGetDelimiter01() <br> * <br> * (正常系) <br> * 観点:F <br> * <br> * 入力値:(状態) this.delimiter:','(固定)<br> * <br> * 期待値:(戻り値) char:','(固定)<br> * <br> * delimiterのgetterが正常に動作することを確認する。<br> * 必ず、カンマを返却することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetDelimiter01() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub01> clazz = CSVFileLineIterator_Stub01.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub01> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub01>(fileName, clazz, columnParserMap); // 引数なし // 前提条件(インスタンス化で設定される) // テスト実施 char result = csvFileLineIterator.getDelimiter(); // 返却値の確認 assertEquals(',', result); // 状態変化なし } /** * testGetEncloseChar01() <br> * <br> * (正常系) <br> * 観点:F <br> * <br> * 入力値:(状態) this.encloseChar:not null<br> * '"'<br> * <br> * 期待値:(戻り値) char:not null<br> * '"'<br> * <br> * encloseCharのgetterが正常に動作することを確認する。 <br> * @throws Exception このメソッドで発生した例外 */ @Test public void testGetEncloseChar01() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("File_Empty.txt"); String fileName = url.getPath(); Class<CSVFileLineIterator_Stub02> clazz = CSVFileLineIterator_Stub02.class; Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); ColumnParser columnParser = new CSVFileLineIterator_ColumnParserStub01(); columnParserMap.put("java.lang.String", columnParser); columnParserMap.put("java.util.Date", columnParser); columnParserMap.put("java.math.BigDecimal", columnParser); columnParserMap.put("java.lang.int", columnParser); CSVFileLineIterator<CSVFileLineIterator_Stub02> csvFileLineIterator = new CSVFileLineIterator<CSVFileLineIterator_Stub02>(fileName, clazz, columnParserMap); // 引数なし // 前提条件(インスタンス化で設定される) // テスト実施 char result = csvFileLineIterator.getEncloseChar(); // 返却値の確認 assertEquals('"', result); // 状態変化なし } /** * 正常系<br> * InputFileColumnのcolumnEncloseCharによって、個々のカラムに囲み文字を設定 * @throws Exception */ @Test public void testNext01() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("CsvFileLineIterator_next01.txt"); String fileName = url.getPath(); Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); columnParserMap.put("java.lang.String", new NullColumnParser()); CSVFileLineIterator<CSVFileLine_Stub01> fileLineIterator = new CSVFileLineIterator<CSVFileLine_Stub01>(fileName, CSVFileLine_Stub01.class, columnParserMap); // テスト実施 CSVFileLine_Stub01 result1 = fileLineIterator.next(); CSVFileLine_Stub01 result2 = fileLineIterator.next(); CSVFileLine_Stub01 result3 = fileLineIterator.next(); // 返却値の確認 assertEquals("1", result1.getColumn1()); assertEquals("22", result1.getColumn2()); assertEquals("333", result1.getColumn3()); assertEquals("4444", result1.getColumn4()); assertEquals("5", result2.getColumn1()); assertEquals("66", result2.getColumn2()); assertEquals("777", result2.getColumn3()); assertEquals("8888", result2.getColumn4()); assertEquals("9", result3.getColumn1()); assertEquals("AA", result3.getColumn2()); assertEquals("BBB", result3.getColumn3()); assertEquals("CCCC", result3.getColumn4()); } /** * 正常系<br> * FileFormatのencloseCharとInputFileColumnのcolumnEncloseCharによって、カラムに囲み文字を設定 * @throws Exception */ @Test public void testNext02() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("CsvFileLineIterator_next02.txt"); String fileName = url.getPath(); Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); columnParserMap.put("java.lang.String", new NullColumnParser()); CSVFileLineIterator<CSVFileLine_Stub02> fileLineIterator = new CSVFileLineIterator<CSVFileLine_Stub02>(fileName, CSVFileLine_Stub02.class, columnParserMap); // テスト実施 CSVFileLine_Stub02 result1 = fileLineIterator.next(); CSVFileLine_Stub02 result2 = fileLineIterator.next(); CSVFileLine_Stub02 result3 = fileLineIterator.next(); // 返却値の確認 assertEquals("1", result1.getColumn1()); assertEquals("22", result1.getColumn2()); assertEquals("333", result1.getColumn3()); assertEquals("4444", result1.getColumn4()); assertEquals("5", result2.getColumn1()); assertEquals("66", result2.getColumn2()); assertEquals("777", result2.getColumn3()); assertEquals("8888", result2.getColumn4()); assertEquals("9", result3.getColumn1()); assertEquals("AA", result3.getColumn2()); assertEquals("BBB", result3.getColumn3()); assertEquals("CCCC", result3.getColumn4()); } /** * 正常系<br> * キャッシュしているアノテーションの情報を利用している事を確認する。<br> * @throws Exception */ @Test public void testNext03() throws Exception { // テスト対象のインスタンス化 URL url = this.getClass().getResource("CsvFileLineIterator_next03.txt"); String fileName = url.getPath(); Map<String, ColumnParser> columnParserMap = new HashMap<String, ColumnParser>(); columnParserMap.put("java.lang.String", new NullColumnParser()); // 様々な設定がされているファイル行オブジェクトを設定 CSVFileLineIterator<CSVFileLine_Stub03> fileLineIterator = new CSVFileLineIterator<CSVFileLine_Stub03>(fileName, CSVFileLine_Stub03.class, columnParserMap); // ファイル行オブジェクトに設定してあった値を全て上書き // 以下の設定が適用されれば、ファイル行オブジェクトの // アノテーションにアクセスしていないことになる。 char[] charArray = new char[] { 0, 0, 0, 0 }; // 前提条件 ReflectionTestUtils.setField(fileLineIterator, "lineFeedChar", "\r\n"); ReflectionTestUtils.setField(fileLineIterator, "delimiter", '_'); ReflectionTestUtils.setField(fileLineIterator, "inputFileColumns", null); ReflectionTestUtils.setField(fileLineIterator, "columnFormats", new String[] { "", "", "", "" }); ReflectionTestUtils.setField(fileLineIterator, "columnBytes", new int[] { -1, -1, -1, -1 }); ReflectionTestUtils.setField(fileLineIterator, "totalBytes", 0); ReflectionTestUtils.setField(fileLineIterator, "trimChars", charArray); ReflectionTestUtils.setField(fileLineIterator, "columnEncloseChar", charArray); ReflectionTestUtils.setField(fileLineIterator, "stringConverters", new NullStringConverter[] { new NullStringConverter(), new NullStringConverter(), new NullStringConverter(), new NullStringConverter() }); LineReader reader = (LineReader) ReflectionTestUtils.getField( fileLineIterator, "lineReader"); ReflectionTestUtils.setField(reader, "lineFeedChar", "\r\n"); // テスト実施 CSVFileLine_Stub03 result1 = fileLineIterator.next(); CSVFileLine_Stub03 result2 = fileLineIterator.next(); CSVFileLine_Stub03 result3 = fileLineIterator.next(); // 返却値の確認 assertEquals("\"1\"", result1.getColumn1()); assertEquals("22", result1.getColumn2()); assertEquals("333", result1.getColumn3()); assertEquals("|4444|", result1.getColumn4()); assertEquals("\"5\"", result2.getColumn1()); assertEquals("66", result2.getColumn2()); assertEquals("777", result2.getColumn3()); assertEquals("|8888|", result2.getColumn4()); assertEquals("\"9\"", result3.getColumn1()); assertEquals("AA", result3.getColumn2()); assertEquals("BBB", result3.getColumn3()); assertEquals("|CCCC|", result3.getColumn4()); } }