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