View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.beanutils2;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertInstanceOf;
22  import static org.junit.jupiter.api.Assertions.assertNotNull;
23  import static org.junit.jupiter.api.Assertions.assertNull;
24  import static org.junit.jupiter.api.Assertions.assertThrows;
25  import static org.junit.jupiter.api.Assertions.assertTrue;
26  
27  import java.lang.reflect.Constructor;
28  import java.lang.reflect.Modifier;
29  
30  import org.junit.jupiter.api.AfterEach;
31  import org.junit.jupiter.api.BeforeEach;
32  import org.junit.jupiter.api.Test;
33  
34  /**
35   * <p>
36   * Test case for {@code ConstructorUtils}
37   * </p>
38   */
39  public class ConstructorUtilsTest {
40  
41      /**
42       * Sets up instance variables required by this test case.
43       */
44      @BeforeEach
45      public void setUp() throws Exception {
46      }
47  
48      /**
49       * Tear down instance variables required by this test case.
50       */
51      @AfterEach
52      public void tearDown() throws Exception {
53      }
54  
55      @Test
56      public void testGetAccessibleConstructor() throws Exception {
57          {
58              final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(TestBean.class, String.class);
59              assertNotNull(ctor);
60              assertTrue(Modifier.isPublic(ctor.getModifiers()));
61          }
62          {
63              final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(TestBean.class, Integer.class);
64              assertNotNull(ctor);
65              assertTrue(Modifier.isPublic(ctor.getModifiers()));
66          }
67          {
68              final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(TestBean.class, Integer.TYPE);
69              assertNull(ctor);
70          }
71      }
72  
73      @Test
74      public void testGetAccessibleConstructorWithConstructorArg() throws Exception {
75          {
76              final Class<?>[] types = { Integer.class };
77              final Constructor<?> c1 = TestBean.class.getConstructor(types);
78              final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(c1);
79              assertNotNull(ctor);
80              assertTrue(Modifier.isPublic(ctor.getModifiers()));
81          }
82          {
83              final Class<?>[] types = { Integer.class };
84              final Constructor<?> c1 = TestBean.class.getDeclaredConstructor(types);
85              final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(c1);
86              assertNotNull(ctor);
87              assertTrue(Modifier.isPublic(ctor.getModifiers()));
88          }
89          {
90              final Class<?>[] types = { Integer.TYPE };
91              final Constructor<?> c1 = TestBean.class.getDeclaredConstructor(types);
92              final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(c1);
93              assertNull(ctor);
94          }
95      }
96  
97      @Test
98      public void testGetAccessibleConstructorWithTypeArray() throws Exception {
99          {
100             final Class<?>[] types = { Boolean.TYPE, String.class };
101             final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(TestBean.class, types);
102             assertNotNull(ctor);
103             assertTrue(Modifier.isPublic(ctor.getModifiers()));
104         }
105         {
106             final Class<?>[] types = { Boolean.TYPE, Boolean.TYPE, String.class };
107             final Constructor<?> ctor = ConstructorUtils.getAccessibleConstructor(TestBean.class, types);
108             assertNull(ctor);
109         }
110     }
111 
112     @Test
113     public void testInvokeConstructor() throws Exception {
114         {
115             final Object obj = ConstructorUtils.invokeConstructor(TestBean.class, "TEST");
116             assertNotNull(obj);
117             assertInstanceOf(TestBean.class, obj);
118             assertEquals("TEST", ((TestBean) obj).getStringProperty());
119         }
120         {
121             final Object obj = ConstructorUtils.invokeConstructor(TestBean.class, Float.valueOf(17.3f));
122             assertNotNull(obj);
123             assertInstanceOf(TestBean.class, obj);
124             assertEquals(17.3f, ((TestBean) obj).getFloatProperty(), 0.0f);
125         }
126     }
127 
128     @Test
129     public void testInvokeConstructorNull() throws Exception {
130         final Object obj = ConstructorUtils.invokeConstructor(TestBean.class, (Object) null);
131         assertNotNull(obj);
132         assertInstanceOf(TestBean.class, obj);
133     }
134 
135     @Test
136     public void testInvokeConstructorWithArgArray() throws Exception {
137         final Object[] args = { Float.valueOf(17.3f), "TEST" };
138         final Object obj = ConstructorUtils.invokeConstructor(TestBean.class, args);
139         assertNotNull(obj);
140         assertInstanceOf(TestBean.class, obj);
141         assertEquals(17.3f, ((TestBean) obj).getFloatProperty(), 0.0f);
142         assertEquals("TEST", ((TestBean) obj).getStringProperty());
143     }
144 
145     @Test
146     public void testInvokeConstructorWithTypeArray() throws Exception {
147         {
148             final Object[] args = { Boolean.TRUE, "TEST" };
149             final Class<?>[] types = { Boolean.TYPE, String.class };
150             final Object obj = ConstructorUtils.invokeConstructor(TestBean.class, args, types);
151             assertNotNull(obj);
152             assertInstanceOf(TestBean.class, obj);
153             assertTrue(((TestBean) obj).getBooleanProperty());
154             assertEquals("TEST", ((TestBean) obj).getStringProperty());
155         }
156         {
157             final Object[] args = { Boolean.TRUE, "TEST" };
158             final Class<?>[] types = { Boolean.class, String.class };
159             final Object obj = ConstructorUtils.invokeConstructor(TestBean.class, args, types);
160             assertNotNull(obj);
161             assertInstanceOf(TestBean.class, obj);
162             assertTrue(((TestBean) obj).isBooleanSecond());
163             assertEquals("TEST", ((TestBean) obj).getStringProperty());
164         }
165     }
166 
167     @Test
168     public void testInvokeExactConstructor() throws Exception {
169         {
170             final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, "TEST");
171             assertNotNull(obj);
172             assertInstanceOf(TestBean.class, obj);
173             assertEquals("TEST", ((TestBean) obj).getStringProperty());
174         }
175         assertThrows(NoSuchMethodException.class, () -> ConstructorUtils.invokeExactConstructor(TestBean.class, Float.valueOf(17.3f)));
176         {
177             final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, Boolean.TRUE);
178             assertNotNull(obj);
179             assertInstanceOf(TestBean.class, obj);
180             assertTrue(((TestBean) obj).isBooleanSecond());
181         }
182     }
183 
184     @Test
185     public void testInvokeExactConstructorWithArgArray() throws Exception {
186         {
187             final Object[] args = { Float.valueOf(17.3f), "TEST" };
188             assertThrows(NoSuchMethodException.class, () -> ConstructorUtils.invokeExactConstructor(TestBean.class, args));
189         }
190         {
191             final Object[] args = { Boolean.TRUE, "TEST" };
192             final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, args);
193             assertNotNull(obj);
194             assertInstanceOf(TestBean.class, obj);
195             assertTrue(((TestBean) obj).isBooleanSecond());
196             assertEquals("TEST", ((TestBean) obj).getStringProperty());
197         }
198     }
199 
200     @Test
201     public void testInvokeExactConstructorWithNull() throws Exception {
202         final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, (Object) null);
203         assertNotNull(obj);
204         assertInstanceOf(TestBean.class, obj);
205     }
206 
207     @Test
208     public void testInvokeExactConstructorWithTypeArray() throws Exception {
209         {
210             final Object[] args = { Boolean.TRUE, "TEST" };
211             final Class<?>[] types = { Boolean.TYPE, String.class };
212             final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, args, types);
213             assertNotNull(obj);
214             assertInstanceOf(TestBean.class, obj);
215             assertTrue(((TestBean) obj).getBooleanProperty());
216             assertEquals("TEST", ((TestBean) obj).getStringProperty());
217         }
218         {
219             final Object[] args = { Boolean.TRUE, "TEST" };
220             final Class<?>[] types = { Boolean.class, String.class };
221             final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, args, types);
222             assertNotNull(obj);
223             assertInstanceOf(TestBean.class, obj);
224             assertTrue(((TestBean) obj).isBooleanSecond());
225             assertEquals("TEST", ((TestBean) obj).getStringProperty());
226         }
227         {
228             final Object[] args = { Float.valueOf(17.3f), "TEST" };
229             final Class<?>[] types = { Float.TYPE, String.class };
230             final Object obj = ConstructorUtils.invokeExactConstructor(TestBean.class, args, types);
231             assertNotNull(obj);
232             assertInstanceOf(TestBean.class, obj);
233             assertEquals(17.3f, ((TestBean) obj).getFloatProperty(), 0.0f);
234             assertEquals("TEST", ((TestBean) obj).getStringProperty());
235         }
236         {
237             final Object[] args = { Float.valueOf(17.3f), "TEST" };
238             final Class<?>[] types = { Float.class, String.class };
239             assertThrows(NoSuchMethodException.class, () -> ConstructorUtils.invokeExactConstructor(TestBean.class, args, types));
240         }
241     }
242 
243 }