View Javadoc
1   /*
2    * SPDX-License-Identifier: Apache-2.0
3    * See LICENSE file for details.
4    *
5    * Copyright 2012-2026 hazendaz
6    *
7    * Portions of initial baseline code (getter/setter test) by Rob Dawson (CodeBox)
8    */
9   package com.codebox.bean;
10  
11  import java.io.ByteArrayInputStream;
12  import java.io.ByteArrayOutputStream;
13  import java.io.NotSerializableException;
14  import java.io.ObjectInputStream;
15  import java.io.ObjectOutputStream;
16  
17  import org.junit.jupiter.api.Assertions;
18  import org.junit.jupiter.api.BeforeEach;
19  import org.junit.jupiter.api.Test;
20  import org.powermock.reflect.Whitebox;
21  
22  /**
23   * The Class JavaBeanTesterTest.
24   */
25  class JavaBeanTesterTest {
26  
27      /** The sample bean. */
28      private SampleBean sampleBean;
29  
30      /** The expected bean. */
31      private SampleBean expectedBean;
32  
33      /**
34       * Inits the.
35       */
36      @BeforeEach
37      void init() {
38          this.sampleBean = new SampleBean(null);
39          this.expectedBean = new SampleBean(null);
40      }
41  
42      /**
43       * Load full bean.
44       */
45      @Test
46      void loadFullBean() {
47          JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.sampleBean);
48          Assertions.assertNotNull(this.sampleBean.getDoubleWrapper());
49      }
50  
51      /**
52       * Load full bean equals.
53       */
54      @Test
55      void loadFullBeanEquals() {
56          JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.sampleBean);
57          JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.expectedBean);
58  
59          this.sampleBean.setSampleDepthBean(new SampleDepthBean());
60          this.expectedBean.setSampleDepthBean(new SampleDepthBean());
61          this.sampleBean.setEmptyBean(new EmptyBean());
62          this.expectedBean.setEmptyBean(new EmptyBean());
63          JavaBeanTester.builder(SampleDepthBean.class).loadData().testInstance(this.sampleBean.getSampleDepthBean());
64          JavaBeanTester.builder(SampleDepthBean.class).loadData().testInstance(this.expectedBean.getSampleDepthBean());
65  
66          JavaBeanTester.builder(SampleBean.class).loadData().testEquals(this.sampleBean, this.expectedBean);
67      }
68  
69      /**
70       * Load full bean equals short.
71       */
72      @Test
73      void loadFullBeanEqualsShort() {
74          JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.sampleBean);
75          JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.expectedBean);
76          JavaBeanTester.builder(SampleBean.class).loadData().testEquals(this.sampleBean, this.expectedBean);
77      }
78  
79      /**
80       * Load full bean equals skip underlying.
81       */
82      @Test
83      void loadFullBeanEqualsSkipUnderlying() {
84          JavaBeanTester.builder(SampleBean.class).testInstance(this.sampleBean);
85          JavaBeanTester.builder(SampleBean.class).testInstance(this.expectedBean);
86          JavaBeanTester.builder(SampleBean.class).testEquals(this.sampleBean, this.expectedBean);
87      }
88  
89      /**
90       * Load_full bean skip underlying data.
91       */
92      @Test
93      void loadFullBeanSkipUnderlyingData() {
94          JavaBeanTester.builder(SampleBean.class).testInstance(this.sampleBean);
95          Assertions.assertNotNull(this.sampleBean.getDoubleWrapper());
96      }
97  
98      /**
99       * Load partial bean equals.
100      */
101     @Test
102     void loadPartialBeanEquals() {
103         JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.sampleBean);
104         JavaBeanTester.builder(SampleBean.class).loadData().testInstance(this.expectedBean);
105 
106         this.sampleBean.setSampleDepthBean(new SampleDepthBean());
107         this.expectedBean.setSampleDepthBean(new SampleDepthBean());
108         JavaBeanTester.builder(SampleDepthBean.class).loadData().testInstance(this.sampleBean.getSampleDepthBean());
109         JavaBeanTester.builder(SampleDepthBean.class).loadData().testInstance(this.expectedBean.getSampleDepthBean());
110 
111         JavaBeanTester.builder(SampleBean.class).loadData().testEquals(this.sampleBean, this.expectedBean);
112     }
113 
114     /**
115      * Load skip bean properties.
116      */
117     @Test
118     void loadSkipBeanProperties() {
119         JavaBeanTester.builder(SampleBean.class).loadData().skip("string").testInstance(this.sampleBean);
120         Assertions.assertNotNull(this.sampleBean.getDoubleWrapper());
121         Assertions.assertNull(this.sampleBean.getString());
122     }
123 
124     /**
125      * Test full bean.
126      */
127     @Test
128     void testFullBean() {
129         JavaBeanTester.builder(SampleBean.class).checkEquals().loadData().test();
130     }
131 
132     /**
133      * Test full bean.
134      */
135     @Test
136     void testFullBeanWithExtension() {
137         JavaBeanTester.builder(SampleBean.class, SampleExtensionBean.class).checkEquals().loadData().test();
138     }
139 
140     /**
141      * Test full bean null ext.
142      */
143     @Test
144     void testFullBeanNullExt() {
145         JavaBeanTester.builder(SampleBean.class).checkEquals().loadData().test();
146         JavaBeanTester.builder(SampleValueObject.class).checkEquals().loadData().test();
147     }
148 
149     /**
150      * Test full bean skip underlying data.
151      */
152     @Test
153     void testFullBeanSkipUnderlyingData() {
154         JavaBeanTester.builder(SampleBean.class).checkEquals().test();
155     }
156 
157     /**
158      * Test full bean skip underlying data.
159      */
160     @Test
161     void testFullBeanSkipUnderlyingDataWithExtension() {
162         JavaBeanTester.builder(SampleBean.class, SampleExtensionBean.class).checkEquals().test();
163     }
164 
165     /**
166      * Test skip bean properties.
167      */
168     @Test
169     void testSkipBeanProperties() {
170         JavaBeanTester.builder(SampleBean.class).checkEquals().loadData().skip("string").test();
171     }
172 
173     /**
174      * Test skip bean properties.
175      */
176     @Test
177     void testSkipBeanPropertiesWithExtension() {
178         JavaBeanTester.builder(SampleBean.class, SampleExtensionBean.class).checkEquals().loadData().skip("string")
179                 .test();
180     }
181 
182     /**
183      * Test skip bean properties null just ignores the skipping.
184      */
185     @Test
186     void testSkipBeanPropertiesNull() {
187         JavaBeanTester.builder(SampleBean.class).checkEquals().loadData().skip((String[]) null).test();
188     }
189 
190     /**
191      * Test skip bean properties null just ignores the skipping.
192      */
193     @Test
194     void testSkipBeanPropertiesNullWithExtension() {
195         JavaBeanTester.builder(SampleBean.class, SampleExtensionBean.class).checkEquals().loadData()
196                 .skip((String[]) null).test();
197     }
198 
199     /**
200      * Test skip can equals.
201      */
202     @Test
203     void testSkipCanEquals() {
204         JavaBeanTester.builder(SampleBean.class).loadData().test();
205     }
206 
207     /**
208      * Test skip can equals.
209      */
210     @Test
211     void testSkipCanEqualsWithExtension() {
212         JavaBeanTester.builder(SampleBean.class, SampleExtensionBean.class).loadData().test();
213     }
214 
215     /**
216      * TestSkip all as false.
217      */
218     @Test
219     void testSkipCanEqualsFalse() {
220         JavaBeanTester.builder(SampleBean.class).checkEquals(false).checkSerializable(false).loadData(false).test();
221     }
222 
223     /**
224      * Test skip all as false.
225      */
226     @Test
227     void testSkipCanEqualsFalseWithExtension() {
228         JavaBeanTester.builder(SampleBean.class, SampleExtensionBean.class).checkEquals(false).checkSerializable(false)
229                 .loadData(false).test();
230     }
231 
232     /**
233      * Test serializable.
234      */
235     @Test
236     void testSerializable() {
237         JavaBeanTester.builder(SerializableBean.class).checkSerializable().test();
238     }
239 
240     /**
241      * Test non serializable.
242      */
243     @Test
244     void testNonSerializableInternallyFails() {
245         JavaBeanTester.builder(NonSerializableBean.class).checkSerializable().skipStrictSerializable().test();
246     }
247 
248     /**
249      * Test non deserializable.
250      *
251      * @throws Exception
252      *             generic exception.
253      */
254     @Test
255     void testNonSerializable() throws Exception {
256         final NonDeserializableBean bean = new NonDeserializableBean();
257         bean.getList().add(new Object());
258 
259         Assertions.assertThrows(NotSerializableException.class, () -> {
260             JavaBeanTesterTest.serialize(bean);
261         });
262     }
263 
264     /**
265      * Test clear.
266      */
267     @Test
268     void testClear() {
269         JavaBeanTester.builder(SerializableBean.class).checkClear().test();
270     }
271 
272     /**
273      * Test clear false.
274      */
275     @Test
276     void testClearFalse() {
277         JavaBeanTester.builder(SerializableBean.class).checkClear(false).test();
278     }
279 
280     /**
281      * Test constructor.
282      */
283     @Test
284     void testConstructor() {
285         JavaBeanTester.builder(SerializableBean.class).checkConstructor().test();
286     }
287 
288     /**
289      * Test constructor false.
290      */
291     @Test
292     void testConstructorFalse() {
293         JavaBeanTester.builder(SerializableBean.class).checkConstructor(false).test();
294     }
295 
296     /**
297      * Test multi constructor.
298      */
299     @Test
300     void testMultiConstructor() {
301         JavaBeanTester.builder(MultiConstructorBean.class).test();
302     }
303 
304     /**
305      * Test multi constructor null extension.
306      */
307     @Test
308     void testMultiConstructorNullExtension() {
309         JavaBeanTester.builder(MultiConstructorBean.class, null).checkEquals().test();
310     }
311 
312     /**
313      * Test temporary single mode.
314      */
315     // TODO 1/12/2019 JWL Temporary until we start using internalized extension logic
316     @Test
317     void testTemporarySingleMode() {
318         final JavaBeanTesterBuilder<String, Object> builder = new JavaBeanTesterBuilder<>(String.class);
319         final JavaBeanTesterWorker<String, Object> worker = Whitebox.getInternalState(builder, "worker");
320         Assertions.assertEquals(String.class, worker.getClazz());
321     }
322 
323     /**
324      * Test sample lombok builder.
325      */
326     @Test
327     void testSampleLombokBuilder() {
328         JavaBeanTester.builder(SampleLombokBuilder.class).checkEquals().checkConstructor().checkClear().loadData()
329                 .test();
330     }
331 
332     /**
333      * Test sample lombok builder null extension.
334      */
335     @Test
336     void testSampleLombokBuilderNullExtension() {
337         JavaBeanTester.builder(SampleLombokBuilder.class, null).checkEquals().checkConstructor().checkClear().loadData()
338                 .test();
339     }
340 
341     /**
342      * Serialize.
343      *
344      * @param <T>
345      *            the generic type
346      * @param object
347      *            the object
348      *
349      * @return the t
350      *
351      * @throws Exception
352      *             the exception
353      */
354     @SuppressWarnings("unchecked")
355     private static <T> T serialize(final T object) throws Exception {
356         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
357         new ObjectOutputStream(baos).writeObject(object);
358 
359         final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
360         return (T) new ObjectInputStream(bais).readObject();
361     }
362 
363 }