View Javadoc
1   /*
2    *    Copyright 2009-2021 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.apache.ibatis.reflection;
17  
18  import static org.junit.jupiter.api.Assertions.assertEquals;
19  import static org.junit.jupiter.api.Assertions.assertFalse;
20  import static org.junit.jupiter.api.Assertions.assertTrue;
21  
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.apache.ibatis.domain.misc.RichType;
26  import org.apache.ibatis.domain.misc.generics.GenericConcrete;
27  import org.junit.jupiter.api.Test;
28  
29  class MetaClassTest {
30  
31    @Test
32    void shouldTestDataTypeOfGenericMethod() {
33      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
34      MetaClass meta = MetaClass.forClass(GenericConcrete.class, reflectorFactory);
35      assertEquals(Long.class, meta.getGetterType("id"));
36      assertEquals(Long.class, meta.getSetterType("id"));
37    }
38  
39    @Test
40    void shouldThrowReflectionExceptionGetGetterType() {
41      try {
42        ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
43        MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
44        meta.getGetterType("aString");
45        org.junit.jupiter.api.Assertions.fail("should have thrown ReflectionException");
46      } catch (ReflectionException expected) {
47        assertEquals("There is no getter for property named \'aString\' in \'class org.apache.ibatis.domain.misc.RichType\'", expected.getMessage());
48      }
49    }
50  
51    @Test
52    void shouldCheckGetterExistance() {
53      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
54      MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
55      assertTrue(meta.hasGetter("richField"));
56      assertTrue(meta.hasGetter("richProperty"));
57      assertTrue(meta.hasGetter("richList"));
58      assertTrue(meta.hasGetter("richMap"));
59      assertTrue(meta.hasGetter("richList[0]"));
60  
61      assertTrue(meta.hasGetter("richType"));
62      assertTrue(meta.hasGetter("richType.richField"));
63      assertTrue(meta.hasGetter("richType.richProperty"));
64      assertTrue(meta.hasGetter("richType.richList"));
65      assertTrue(meta.hasGetter("richType.richMap"));
66      assertTrue(meta.hasGetter("richType.richList[0]"));
67  
68      assertEquals("richType.richProperty", meta.findProperty("richType.richProperty", false));
69  
70      assertFalse(meta.hasGetter("[0]"));
71    }
72  
73    @Test
74    void shouldCheckSetterExistance() {
75      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
76      MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
77      assertTrue(meta.hasSetter("richField"));
78      assertTrue(meta.hasSetter("richProperty"));
79      assertTrue(meta.hasSetter("richList"));
80      assertTrue(meta.hasSetter("richMap"));
81      assertTrue(meta.hasSetter("richList[0]"));
82  
83      assertTrue(meta.hasSetter("richType"));
84      assertTrue(meta.hasSetter("richType.richField"));
85      assertTrue(meta.hasSetter("richType.richProperty"));
86      assertTrue(meta.hasSetter("richType.richList"));
87      assertTrue(meta.hasSetter("richType.richMap"));
88      assertTrue(meta.hasSetter("richType.richList[0]"));
89  
90      assertFalse(meta.hasSetter("[0]"));
91    }
92  
93    @Test
94    void shouldCheckTypeForEachGetter() {
95      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
96      MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
97      assertEquals(String.class, meta.getGetterType("richField"));
98      assertEquals(String.class, meta.getGetterType("richProperty"));
99      assertEquals(List.class, meta.getGetterType("richList"));
100     assertEquals(Map.class, meta.getGetterType("richMap"));
101     assertEquals(List.class, meta.getGetterType("richList[0]"));
102 
103     assertEquals(RichType.class, meta.getGetterType("richType"));
104     assertEquals(String.class, meta.getGetterType("richType.richField"));
105     assertEquals(String.class, meta.getGetterType("richType.richProperty"));
106     assertEquals(List.class, meta.getGetterType("richType.richList"));
107     assertEquals(Map.class, meta.getGetterType("richType.richMap"));
108     assertEquals(List.class, meta.getGetterType("richType.richList[0]"));
109   }
110 
111   @Test
112   void shouldCheckTypeForEachSetter() {
113     ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
114     MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
115     assertEquals(String.class, meta.getSetterType("richField"));
116     assertEquals(String.class, meta.getSetterType("richProperty"));
117     assertEquals(List.class, meta.getSetterType("richList"));
118     assertEquals(Map.class, meta.getSetterType("richMap"));
119     assertEquals(List.class, meta.getSetterType("richList[0]"));
120 
121     assertEquals(RichType.class, meta.getSetterType("richType"));
122     assertEquals(String.class, meta.getSetterType("richType.richField"));
123     assertEquals(String.class, meta.getSetterType("richType.richProperty"));
124     assertEquals(List.class, meta.getSetterType("richType.richList"));
125     assertEquals(Map.class, meta.getSetterType("richType.richMap"));
126     assertEquals(List.class, meta.getSetterType("richType.richList[0]"));
127   }
128 
129   @Test
130   void shouldCheckGetterAndSetterNames() {
131     ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
132     MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
133     assertEquals(5, meta.getGetterNames().length);
134     assertEquals(5, meta.getSetterNames().length);
135   }
136 
137   @Test
138   void shouldFindPropertyName() {
139     ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
140     MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
141     assertEquals("richField", meta.findProperty("RICHfield"));
142   }
143 
144 }