View Javadoc

1   package org.apache.torque.om.mapper;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import static org.mockito.Mockito.verify;
23  import static org.mockito.Mockito.verifyNoMoreInteractions;
24  import static org.mockito.Mockito.when;
25  
26  import java.io.InputStream;
27  import java.io.Reader;
28  import java.math.BigDecimal;
29  import java.net.URL;
30  import java.sql.Array;
31  import java.sql.Blob;
32  import java.sql.Clob;
33  import java.sql.Date;
34  import java.sql.Ref;
35  import java.sql.ResultSet;
36  import java.sql.ResultSetMetaData;
37  import java.sql.SQLException;
38  import java.sql.Time;
39  import java.sql.Timestamp;
40  import java.util.ArrayList;
41  import java.util.Arrays;
42  import java.util.List;
43  
44  import org.apache.torque.BaseTestCase;
45  import org.apache.torque.TorqueException;
46  import org.mockito.Mock;
47  import org.mockito.MockitoAnnotations;
48  
49  public class ObjectListMapperTest extends BaseTestCase
50  {
51      /** Mock result set. */
52      @Mock
53      private ResultSet resultSet;
54  
55      /** Mock result set metadata. */
56      @Mock
57      private ResultSetMetaData resultSetMetaData;
58  
59      /** Mock array. */
60      @Mock
61      private Array array;
62  
63      /** Mock blob. */
64      @Mock
65      private Blob blob;
66  
67      /** Mock clob. */
68      @Mock
69      private Clob clob;
70  
71      /** Mock input stream. */
72      @Mock
73      private InputStream inputStream;
74  
75      /** Mock reader. */
76      @Mock
77      private Reader reader;
78  
79      /** Mock ref. */
80      @Mock
81      private Ref ref;
82  
83      /** Object instance. */
84      private Object object = new Object();
85  
86      @Override
87      public void setUp() throws Exception
88      {
89          super.setUp();
90          MockitoAnnotations.initMocks(this);
91          when(resultSet.getObject(0)).thenThrow(
92                  new SQLException("index is 1 based"));
93          when(resultSet.getBigDecimal(1)).thenReturn(null);
94          when(resultSet.getObject(1)).thenReturn(null);
95          when(resultSet.getArray(2)).thenReturn(array);
96          when(resultSet.getObject(2)).thenReturn(array);
97          when(resultSet.getBigDecimal(3)).thenReturn(new BigDecimal("123.456"));
98          when(resultSet.getObject(3)).thenReturn(new BigDecimal("123.456"));
99          when(resultSet.getBinaryStream(4)).thenReturn(inputStream);
100         when(resultSet.getObject(4)).thenReturn(inputStream);
101         when(resultSet.getBlob(5)).thenReturn(blob);
102         when(resultSet.getBoolean(6)).thenReturn(true);
103         when(resultSet.getByte(7)).thenReturn(Byte.valueOf("7"));
104         when(resultSet.getBytes(8)).thenReturn(new byte[] {8});
105         when(resultSet.getCharacterStream(9)).thenReturn(reader);
106         when(resultSet.getClob(10)).thenReturn(clob);
107         when(resultSet.getDate(11)).thenReturn(new Date(11L));
108         when(resultSet.getDouble(12)).thenReturn(12d);
109         when(resultSet.getFloat(13)).thenReturn(13f);
110         when(resultSet.getInt(14)).thenReturn(14);
111         when(resultSet.getLong(15)).thenReturn(15L);
112         when(resultSet.getObject(16)).thenReturn(object);
113         when(resultSet.getRef(17)).thenReturn(ref);
114         when(resultSet.getShort(18)).thenReturn(Short.valueOf("18"));
115         when(resultSet.getString(19)).thenReturn("abc");
116         when(resultSet.getTime(20)).thenReturn(new Time(20L));
117         when(resultSet.getTimestamp(21)).thenReturn(new Timestamp(21L));
118         when(resultSet.getURL(22)).thenReturn(new URL("http://22"));
119         when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
120         when(resultSetMetaData.getColumnCount()).thenReturn(3);
121     }
122 
123     /**
124      * Tests the processRow method for a mapper where the length is determined
125      * from the Metadata.
126      *
127      * @throws Exception if the test fails
128      */
129     public void testProcessRowLengthDeterminedFromMetadata() throws Exception
130     {
131         // prepare
132         ObjectListMapper mapper = new ObjectListMapper();
133 
134         // execute
135         List<Object> result = mapper.processRow(resultSet, 0);
136 
137         // verify
138         assertEquals(3, result.size());
139         assertEquals(null, result.get(0));
140         assertEquals(array, result.get(1));
141         assertEquals(new BigDecimal("123.456"), result.get(2));
142         verify(resultSet).getMetaData();
143         verify(resultSetMetaData).getColumnCount();
144         verify(resultSet).getObject(1);
145         verify(resultSet).getObject(2);
146         verify(resultSet).getObject(3);
147         verifyNoMoreInteractions(resultSet, resultSetMetaData);
148     }
149 
150     /**
151      * Tests the processRow method for a mapper with offset
152      * where the length is determined from the Metadata.
153      *
154      * @throws Exception if the test fails
155      */
156     public void testProcessRowLengthDeterminedFromMetadataWithOffset()
157             throws Exception
158     {
159         // prepare
160         ObjectListMapper mapper = new ObjectListMapper();
161 
162         // execute
163         List<Object> result = mapper.processRow(resultSet, 1);
164 
165         // verify
166         assertEquals(2, result.size());
167         assertEquals(array, result.get(0));
168         assertEquals(new BigDecimal("123.456"), result.get(1));
169         verify(resultSet).getMetaData();
170         verify(resultSetMetaData).getColumnCount();
171         verify(resultSet).getObject(2);
172         verify(resultSet).getObject(3);
173         verifyNoMoreInteractions(resultSet, resultSetMetaData);
174     }
175 
176     /**
177      * Tests the processRow method for a mapper with a fixed column count.
178      *
179      * @throws Exception if the test fails
180      */
181     public void testProcessRowLenghtAsArgument() throws Exception
182     {
183         // prepare
184         ObjectListMapper mapper = new ObjectListMapper(2);
185 
186         // execute
187         List<Object> result = mapper.processRow(resultSet, 1);
188 
189         // verify
190         assertEquals(2, result.size());
191         assertEquals(array, result.get(0));
192         assertEquals(new BigDecimal("123.456"), result.get(1));
193         verify(resultSet).getObject(2);
194         verify(resultSet).getObject(3);
195         verifyNoMoreInteractions(resultSet, resultSetMetaData);
196     }
197 
198     /**
199      * Tests the processRow method for a mapper with a fixed column count.
200      *
201      * @throws Exception if the test fails
202      */
203     public void testProcessRowClassListAsArgument() throws Exception
204     {
205         // prepare
206         List<Class<?>> classList = new ArrayList<Class<?>>();
207         classList.add(BigDecimal.class);
208         classList.add(Array.class);
209         classList.add(BigDecimal.class);
210         classList.add(InputStream.class);
211         classList.add(Blob.class);
212         classList.add(Boolean.class);
213         classList.add(Byte.class);
214         classList.add(byte[].class);
215         classList.add(Reader.class);
216         classList.add(Clob.class);
217         classList.add(Date.class);
218         classList.add(Double.class);
219         classList.add(Float.class);
220         classList.add(Integer.class);
221         classList.add(Long.class);
222         classList.add(Object.class);
223         classList.add(Ref.class);
224         classList.add(Short.class);
225         classList.add(String.class);
226         classList.add(Time.class);
227         classList.add(Timestamp.class);
228         classList.add(URL.class);
229         ObjectListMapper mapper = new ObjectListMapper(classList);
230 
231         // execute
232         List<Object> result = mapper.processRow(resultSet, 0);
233 
234         // verify
235         assertEquals(22, result.size());
236         assertEquals(null, result.get(0));
237         assertEquals(array, result.get(1));
238         assertEquals(new BigDecimal("123.456"), result.get(2));
239         assertEquals(inputStream, result.get(3));
240         assertEquals(blob, result.get(4));
241         assertEquals(true, result.get(5));
242         assertEquals(Byte.valueOf("7"), result.get(6));
243         assertTrue(Arrays.equals(new byte[] {8}, (byte[]) result.get(7)));
244         assertEquals(reader, result.get(8));
245         assertEquals(clob, result.get(9));
246         assertEquals(new Date(11L), result.get(10));
247         assertEquals(12d, result.get(11));
248         assertEquals(13f, result.get(12));
249         assertEquals(14, result.get(13));
250         assertEquals(15L, result.get(14));
251         assertEquals(object, result.get(15));
252         assertEquals(ref, result.get(16));
253         assertEquals(Short.valueOf("18"), result.get(17));
254         assertEquals("abc", result.get(18));
255         assertEquals(new Time(20L), result.get(19));
256         assertEquals(new Timestamp(21L), result.get(20));
257         assertEquals(new URL("http://22"), result.get(21));
258 
259 
260         verify(resultSet).getBigDecimal(1);
261         verify(resultSet).getArray(2);
262         verify(resultSet).getBigDecimal(3);
263         verify(resultSet).getBinaryStream(4);
264         verify(resultSet).getBlob(5);
265         verify(resultSet).getBoolean(6);
266         verify(resultSet).getByte(7);
267         verify(resultSet).getBytes(8);
268         verify(resultSet).getCharacterStream(9);
269         verify(resultSet).getClob(10);
270         verify(resultSet).getDate(11);
271         verify(resultSet).getDouble(12);
272         verify(resultSet).getFloat(13);
273         verify(resultSet).getInt(14);
274         verify(resultSet).getLong(15);
275         verify(resultSet).getObject(16);
276         verify(resultSet).getRef(17);
277         verify(resultSet).getShort(18);
278         verify(resultSet).getString(19);
279         verify(resultSet).getTime(20);
280         verify(resultSet).getTimestamp(21);
281         verify(resultSet).getURL(22);
282         verifyNoMoreInteractions(resultSet, resultSetMetaData);
283     }
284 
285     /**
286      * Tests the processRow method if the resultSet throws a SqlException.
287      *
288      * @throws Exception if the test fails
289      */
290     public void testProcessRowSqlException() throws Exception
291     {
292         // prepare
293         ObjectListMapper mapper = new ObjectListMapper(1);
294 
295         // execute
296         try
297         {
298             mapper.processRow(resultSet, -1);
299             // verify 1
300             fail("Exception expected");
301         }
302         catch (TorqueException e)
303         {
304             // verify 2
305             assertEquals("java.sql.SQLException: index is 1 based", e.getMessage());
306             assertEquals(SQLException.class, e.getCause().getClass());
307             assertEquals("index is 1 based", e.getCause().getMessage());
308             verify(resultSet).getObject(0);
309             verifyNoMoreInteractions(resultSet);
310         }
311     }
312 
313     /**
314      * Tests the processRow method if the resultSet throws a SqlException.
315      *
316      * @throws Exception if the test fails
317      */
318     public void testUnknownClass() throws Exception
319     {
320         // prepare
321         List<Class<?>> classList = new ArrayList<Class<?>>();
322         classList.add(RecordMapper.class);
323         ObjectListMapper mapper = new ObjectListMapper(classList);
324 
325         // execute
326         try
327         {
328             mapper.processRow(resultSet, -1);
329             // verify 1
330             fail("Exception expected");
331         }
332         catch (IllegalArgumentException e)
333         {
334             // verify 2
335             assertEquals("Unknown convertClass "
336               + "org.apache.torque.om.mapper.RecordMapper at position 0",
337               e.getMessage());
338             verifyNoMoreInteractions(resultSet);
339         }
340     }
341 
342     public void testByteNull() throws Exception
343     {
344         // prepare
345         byte zero = 0;
346         when(resultSet.getByte(1)).thenReturn(zero);
347         when(resultSet.wasNull()).thenReturn(true);
348         List<Class<?>> classList = new ArrayList<Class<?>>();
349         classList.add(Byte.class);
350         ObjectListMapper mapper = new ObjectListMapper(classList);
351 
352         // execute
353         List<Object> result = mapper.processRow(resultSet, 0);
354 
355         // verify
356         assertEquals(1, result.size());
357         assertEquals(null, result.get(0));
358         verify(resultSet).getByte(1);
359         verify(resultSet).wasNull();
360         verifyNoMoreInteractions(resultSet);
361     }
362 
363     public void testShortNull() throws Exception
364     {
365         // prepare
366         short zero = 0;
367         when(resultSet.getShort(1)).thenReturn(zero);
368         when(resultSet.wasNull()).thenReturn(true);
369         List<Class<?>> classList = new ArrayList<Class<?>>();
370         classList.add(Short.class);
371         ObjectListMapper mapper = new ObjectListMapper(classList);
372 
373         // execute
374         List<Object> result = mapper.processRow(resultSet, 0);
375 
376         // verify
377         assertEquals(1, result.size());
378         assertEquals(null, result.get(0));
379         verify(resultSet).getShort(1);
380         verify(resultSet).wasNull();
381         verifyNoMoreInteractions(resultSet);
382     }
383 
384     public void testIntegerNull() throws Exception
385     {
386         // prepare
387         when(resultSet.getInt(1)).thenReturn(0);
388         when(resultSet.wasNull()).thenReturn(true);
389         List<Class<?>> classList = new ArrayList<Class<?>>();
390         classList.add(Integer.class);
391         ObjectListMapper mapper = new ObjectListMapper(classList);
392 
393         // execute
394         List<Object> result = mapper.processRow(resultSet, 0);
395 
396         // verify
397         assertEquals(1, result.size());
398         assertEquals(null, result.get(0));
399         verify(resultSet).getInt(1);
400         verify(resultSet).wasNull();
401         verifyNoMoreInteractions(resultSet);
402     }
403 
404     public void testLongNull() throws Exception
405     {
406         // prepare
407         when(resultSet.getLong(1)).thenReturn(0L);
408         when(resultSet.wasNull()).thenReturn(true);
409         List<Class<?>> classList = new ArrayList<Class<?>>();
410         classList.add(Long.class);
411         ObjectListMapper mapper = new ObjectListMapper(classList);
412 
413         // execute
414         List<Object> result = mapper.processRow(resultSet, 0);
415 
416         // verify
417         assertEquals(1, result.size());
418         assertEquals(null, result.get(0));
419         verify(resultSet).getLong(1);
420         verify(resultSet).wasNull();
421         verifyNoMoreInteractions(resultSet);
422     }
423 
424     public void testDoubleNull() throws Exception
425     {
426         // prepare
427         when(resultSet.getDouble(1)).thenReturn(0d);
428         when(resultSet.wasNull()).thenReturn(true);
429         List<Class<?>> classList = new ArrayList<Class<?>>();
430         classList.add(Double.class);
431         ObjectListMapper mapper = new ObjectListMapper(classList);
432 
433         // execute
434         List<Object> result = mapper.processRow(resultSet, 0);
435 
436         // verify
437         assertEquals(1, result.size());
438         assertEquals(null, result.get(0));
439         verify(resultSet).getDouble(1);
440         verify(resultSet).wasNull();
441         verifyNoMoreInteractions(resultSet);
442     }
443 
444     public void testFloatNull() throws Exception
445     {
446         // prepare
447         when(resultSet.getFloat(1)).thenReturn(0f);
448         when(resultSet.wasNull()).thenReturn(true);
449         List<Class<?>> classList = new ArrayList<Class<?>>();
450         classList.add(Float.class);
451         ObjectListMapper mapper = new ObjectListMapper(classList);
452 
453         // execute
454         List<Object> result = mapper.processRow(resultSet, 0);
455 
456         // verify
457         assertEquals(1, result.size());
458         assertEquals(null, result.get(0));
459         verify(resultSet).getFloat(1);
460         verify(resultSet).wasNull();
461         verifyNoMoreInteractions(resultSet);
462     }
463 }