View Javadoc
1   package com.github.mygreen.supercsv.builder;
2   
3   import static org.junit.Assert.*;
4   
5   import java.util.List;
6   
7   import static org.assertj.core.api.Assertions.*;
8   
9   
10  import org.junit.Before;
11  import org.junit.Test;
12  import org.supercsv.exception.SuperCsvException;
13  
14  import com.github.mygreen.supercsv.annotation.CsvBean;
15  import com.github.mygreen.supercsv.annotation.CsvColumn;
16  import com.github.mygreen.supercsv.annotation.CsvPartial;
17  import com.github.mygreen.supercsv.builder.BeanMappingFactory;
18  import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
19  
20  /**
21   * {@link BeanMappingFactory}/{@link BeanMappingFactoryHelper}のテスタ
22   *
23   * @version 2.2
24   * @since 2.0
25   * @author T.TSUCHIE
26   *
27   */
28  public class BeanMappingFactoryTest {
29      
30      private BeanMappingFactory factory;
31      
32      private BeanMappingFactory lazyFactory;
33      
34      private final Class<?>[] groupEmpty = new Class[]{};
35      
36      @Before
37      public void setUp() throws Exception {
38          this.factory = new BeanMappingFactory();
39          this.lazyFactory = new LazyBeanMappingFactory();
40      }
41      
42      /**
43       * コンストラクタのテスト - 引数がnullの場合
44       */
45      @Test(expected=NullPointerException.class)
46      public void testConstructor_argNull() {
47          
48          factory.create(null, groupEmpty);
49          
50          fail();
51          
52      }
53      
54      /**
55       * フィールドの修飾子のテスト
56       */
57      @Test
58      public void testCreate_modifires() {
59          
60          BeanMapping<AllModifiresBean> beanMapping = factory.create(AllModifiresBean.class, groupEmpty);
61          
62          assertThat(beanMapping.getColumns()).hasSize(4);
63          
64      }
65      
66      /**
67       * {@link CsvBean}アノテーションが存在しない
68       */
69      @Test
70      public void testCreate_beanAnno_no() {
71          
72          assertThatThrownBy(() -> factory.create(NoBeanAnnoBean.class, groupEmpty))
73                  .isInstanceOf(SuperCsvInvalidAnnotationException.class)
74                  .hasMessage("'%s' において、アノテーション @CsvBean が見つかりません。",
75                          NoBeanAnnoBean.class.getName());
76      }
77      
78      /**
79       * {@link CsvColumn}アノテーションが存在しない
80       */
81      @Test
82      public void testCreate_columnAnno_no() {
83          
84          assertThatThrownBy(() -> factory.create(NoColumnAnnoBean.class, groupEmpty))
85              .isInstanceOf(SuperCsvInvalidAnnotationException.class)
86              .hasMessage("'%s' において、アノテーション @CsvColumn が見つかりません。",
87                      NoColumnAnnoBean.class.getName());
88          
89      }
90      
91      /**
92       * {@link CsvColumn}アノテーションのnumber属性値が0以下の場合
93       */
94      @Test
95      public void testCreate_columnAnno_numberWrong_lessZero() {
96          
97          assertThatThrownBy(() -> factory.create(ColumnNumberLessZeroBean.class, groupEmpty))
98              .isInstanceOf(SuperCsvInvalidAnnotationException.class)
99              .hasMessage("'%s' において、アノテーション @CsvColumn の属性 'number' の値(0)は、1以上の値を設定してください。",
100                     ColumnNumberLessZeroBean.class.getName());
101         
102     }
103     
104     /**
105      * {@link CsvColumn}アノテーションのnumber属性値が重複の場合
106      */
107     @Test
108     public void testCreate_columnAnno_numberWrong_duplicate() {
109         
110         assertThatThrownBy(() -> factory.create(ColumnNumberDuplicateBean.class, groupEmpty))
111             .isInstanceOf(SuperCsvInvalidAnnotationException.class)
112             .hasMessage("'%s' において、アノテーション @CsvColumn の属性 'number' の値([2])が重複しています。",
113                     ColumnNumberDuplicateBean.class.getName());
114             
115     }
116     
117     /**
118      * 部分的なカラムの場合 - {@link CsvPartial}はない。
119      */
120     @Test
121     public void testCreate_partial_noAnno() {
122         
123         BeanMapping<PartialNoAnnoBean> beanMapping = factory.create(PartialNoAnnoBean.class, groupEmpty);
124         
125         assertThat(beanMapping.getColumns()).hasSize(4);
126         
127         {
128             // 部分的なカラム
129             ColumnMapping column = beanMapping.getColumnMapping(1).get();
130             assertThat(column.isPartialized()).isTrue();
131             assertThat(column.getField()).isNull();
132             assertThat(column.getName()).isNull();
133             assertThat(column.getLabel()).isEqualTo("column1");
134             assertThat(column.getCellProcessorForReading()).isNull();
135             assertThat(column.getCellProcessorForWriting()).isNull();
136             
137         }
138         
139         {
140             // 通常のカラム
141             ColumnMapping column = beanMapping.getColumnMapping(2).get();
142             assertThat(column.isPartialized()).isFalse();
143             assertThat(column.getField()).isNotNull();
144             assertThat(column.getName()).isEqualTo("col2");
145             assertThat(column.getLabel()).isEqualTo("col2");
146             assertThat(column.getCellProcessorForReading()).isNotNull();
147             assertThat(column.getCellProcessorForWriting()).isNotNull();
148             
149         }
150         
151         {
152             // 部分的なカラム
153             ColumnMapping column = beanMapping.getColumnMapping(3).get();
154             assertThat(column.isPartialized()).isTrue();
155             assertThat(column.getField()).isNull();
156             assertThat(column.getName()).isNull();
157             assertThat(column.getLabel()).isEqualTo("column3");
158             assertThat(column.getCellProcessorForReading()).isNull();
159             assertThat(column.getCellProcessorForWriting()).isNull();
160             
161         }
162         
163         {
164             // 通常のカラム
165             ColumnMapping column = beanMapping.getColumnMapping(4).get();
166             assertThat(column.isPartialized()).isFalse();
167             assertThat(column.getField()).isNotNull();
168             assertThat(column.getName()).isEqualTo("col4");
169             assertThat(column.getLabel()).isEqualTo("カラム4");
170             assertThat(column.getCellProcessorForReading()).isNotNull();
171             assertThat(column.getCellProcessorForWriting()).isNotNull();
172             
173         }
174         
175     }
176     
177     /**
178      * 部分的なカラムの場合 - {@link CsvPartial}あり
179      */
180     @Test
181     public void testCreate_partial_existAnno() {
182         
183         BeanMapping<PartialExistAnnoBean> beanMapping = factory.create(PartialExistAnnoBean.class, groupEmpty);
184         
185         assertThat(beanMapping.getColumns()).hasSize(5);
186         
187         {
188             // 部分的なカラム
189             ColumnMapping column = beanMapping.getColumnMapping(1).get();
190             assertThat(column.isPartialized()).isTrue();
191             assertThat(column.getField()).isNull();
192             assertThat(column.getName()).isNull();
193             assertThat(column.getLabel()).isEqualTo("カラム1");
194             assertThat(column.getCellProcessorForReading()).isNull();
195             assertThat(column.getCellProcessorForWriting()).isNull();
196             
197         }
198         
199         {
200             // 通常のカラム
201             ColumnMapping column = beanMapping.getColumnMapping(2).get();
202             assertThat(column.isPartialized()).isFalse();
203             assertThat(column.getField()).isNotNull();
204             assertThat(column.getName()).isEqualTo("col2");
205             assertThat(column.getLabel()).isEqualTo("col2");
206             assertThat(column.getCellProcessorForReading()).isNotNull();
207             assertThat(column.getCellProcessorForWriting()).isNotNull();
208             
209         }
210         
211         {
212             // 部分的なカラム
213             ColumnMapping column = beanMapping.getColumnMapping(3).get();
214             assertThat(column.isPartialized()).isTrue();
215             assertThat(column.getField()).isNull();
216             assertThat(column.getName()).isNull();
217             assertThat(column.getLabel()).isEqualTo("カラム3");
218             assertThat(column.getCellProcessorForReading()).isNull();
219             assertThat(column.getCellProcessorForWriting()).isNull();
220             
221         }
222         
223         {
224             // 通常のカラム
225             ColumnMapping column = beanMapping.getColumnMapping(4).get();
226             assertThat(column.isPartialized()).isFalse();
227             assertThat(column.getField()).isNotNull();
228             assertThat(column.getName()).isEqualTo("col4");
229             assertThat(column.getLabel()).isEqualTo("カラム4");
230             assertThat(column.getCellProcessorForReading()).isNotNull();
231             assertThat(column.getCellProcessorForWriting()).isNotNull();
232         }
233         
234         {
235             // 部分的なカラム
236             ColumnMapping column = beanMapping.getColumnMapping(5).get();
237             assertThat(column.isPartialized()).isTrue();
238             assertThat(column.getField()).isNull();
239             assertThat(column.getName()).isNull();
240             assertThat(column.getLabel()).isEqualTo("カラム5");
241             assertThat(column.getCellProcessorForReading()).isNull();
242             assertThat(column.getCellProcessorForWriting()).isNull();
243             
244         }
245         
246     }
247     
248     /**
249      * 部分的なカラムの場合 - {@link CsvPartial}のcolumnSizeの値が、定義されているカラムよりも小さい場合
250      */
251     @Test
252     public void testCreate_partial_overSize() {
253         
254         assertThatThrownBy(() -> factory.create(PartialOverSizeBean.class, groupEmpty))
255             .isInstanceOf(SuperCsvInvalidAnnotationException.class)
256             .hasMessage("'%s' において、アノテーション @CsvPartial の属性 'columnSize' の値 (2) は、定義している最大の @CsvColumn の属性 'number' の値(4)以上の設定をしてください。",
257                     PartialOverSizeBean.class.getName());
258         
259     }
260     
261     /**
262      * カラム番号が未決定のラベルをチェックする
263      */
264     @Test
265     public void testValidateNonDeterminedColumns() {
266         
267         BeanMapping<NonDeterminedColumnBean> beanMapping = lazyFactory.create(NonDeterminedColumnBean.class, groupEmpty);
268         
269         Class<?> beanType = beanMapping.getType();
270         List<ColumnMapping> list = beanMapping.getColumns();
271         String[] headers = new String[] {"カラム", "カラム2", "カラム三"};
272         
273         assertThatThrownBy(() -> BeanMappingFactoryHelper.validateNonDeterminedColumnNumber(beanType, list, headers))
274             .isInstanceOf(SuperCsvException.class)
275             .hasMessage("'%s' のヘッダー([カラム, カラム2, カラム三])において、定義しているが一致しないラベル([カラム1, カラム3])があります。",
276                     NonDeterminedColumnBean.class.getName());
277         
278     }
279     
280     /**
281      * 修飾子の確認用のBean
282      *
283      */
284     @CsvBean
285     class AllModifiresBean {
286         
287         @CsvColumn(number=1)
288         public String fpublic;
289         
290         @CsvColumn(number=2)
291         protected String fprotected;
292         
293         @CsvColumn(number=3)
294         String fdefault;
295         
296         @CsvColumn(number=4)
297         private String fprivate;
298         
299         public String getFpublic() {
300             return fpublic;
301         }
302         
303         public void setFpublic(String fpublic) {
304             this.fpublic = fpublic;
305         }
306         
307         public String getFprotected() {
308             return fprotected;
309         }
310         
311         public void setFprotected(String fprotected) {
312             this.fprotected = fprotected;
313         }
314         
315         public String getFdefault() {
316             return fdefault;
317         }
318         
319         public void setFdefault(String fdefault) {
320             this.fdefault = fdefault;
321         }
322         
323         public String getFprivate() {
324             return fprivate;
325         }
326         
327         public void setFprivate(String fprivate) {
328             this.fprivate = fprivate;
329         }
330     }
331     
332     /**
333      * Bean用のアノテーションがない
334      *
335      */
336     private static class NoBeanAnnoBean {
337         
338         @CsvColumn(number=1)
339         private String col1;
340         
341     }
342     
343     /**
344      * カラム用のアノテーションがない
345      *
346      */
347     @CsvBean
348     private static class NoColumnAnnoBean {
349         
350         private String col1;
351         
352     }
353     
354     /**
355      * カラムの番号が0以下の場合
356      *
357      */
358     @CsvBean
359     private static class ColumnNumberLessZeroBean {
360         
361         @CsvColumn(number=0)
362         private String col1;
363         
364         @CsvColumn(number=1)
365         private String col2;
366     }
367     
368     /**
369      * カラムの番号が重複の場合
370      *
371      */
372     @CsvBean
373     private static class ColumnNumberDuplicateBean {
374         
375         @CsvColumn(number=1)
376         private String col1;
377         
378         @CsvColumn(number=2)
379         private String col2;
380         
381         @CsvColumn(number=2)
382         private String col3;
383         
384         @CsvColumn(number=4)
385         private String col4;
386     }
387     
388     /**
389      * 部分的なカラムの場合 - {@link CsvPartial}はない。
390      *
391      */
392     @CsvBean
393     private static class PartialNoAnnoBean {
394         
395         @CsvColumn(number=2)
396         private String col2;
397         
398         @CsvColumn(number=4, label="カラム4")
399         private String col4;
400         
401     }
402     
403     /**
404      * 部分的なカラムの場合 - {@link CsvPartial}あり。
405      *
406      */
407     @CsvBean
408     @CsvPartial(columnSize=5, headers={
409             @CsvPartial.Header(number=1, label="カラム1"),
410             @CsvPartial.Header(number=3, label="カラム3"),
411             @CsvPartial.Header(number=5, label="カラム5"),
412     })
413     private static class PartialExistAnnoBean {
414         
415         @CsvColumn(number=2)
416         private String col2;
417         
418         @CsvColumn(number=4, label="カラム4")
419         private String col4;
420         
421     }
422     
423     /**
424      * 部分的なカラムの場合 - 想定のサイズが定義されているカラムよりも小さい場合
425      *
426      */
427     @CsvBean
428     @CsvPartial(columnSize=2)
429     private static class PartialOverSizeBean {
430         
431         @CsvColumn(number=2)
432         private String col2;
433         
434         @CsvColumn(number=4, label="カラム4")
435         private String col4;
436         
437     }
438     
439     /**
440      * カラムの番号が0以下の場合 - ラベル指定
441      *
442      */
443     @CsvBean
444     private static class NonDeterminedColumnBean {
445         
446         @CsvColumn(label="カラム1")
447         private String col1;
448         
449         @CsvColumn(number=1)
450         private String col2;
451         
452         @CsvColumn(label="カラム3")
453         private String col3;
454     }
455 }