1 package org.apache.torque.om.mapper;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
52 @Mock
53 private ResultSet resultSet;
54
55
56 @Mock
57 private ResultSetMetaData resultSetMetaData;
58
59
60 @Mock
61 private Array array;
62
63
64 @Mock
65 private Blob blob;
66
67
68 @Mock
69 private Clob clob;
70
71
72 @Mock
73 private InputStream inputStream;
74
75
76 @Mock
77 private Reader reader;
78
79
80 @Mock
81 private Ref ref;
82
83
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
125
126
127
128
129 public void testProcessRowLengthDeterminedFromMetadata() throws Exception
130 {
131
132 ObjectListMapper mapper = new ObjectListMapper();
133
134
135 List<Object> result = mapper.processRow(resultSet, 0);
136
137
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
152
153
154
155
156 public void testProcessRowLengthDeterminedFromMetadataWithOffset()
157 throws Exception
158 {
159
160 ObjectListMapper mapper = new ObjectListMapper();
161
162
163 List<Object> result = mapper.processRow(resultSet, 1);
164
165
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
178
179
180
181 public void testProcessRowLenghtAsArgument() throws Exception
182 {
183
184 ObjectListMapper mapper = new ObjectListMapper(2);
185
186
187 List<Object> result = mapper.processRow(resultSet, 1);
188
189
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
200
201
202
203 public void testProcessRowClassListAsArgument() throws Exception
204 {
205
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
232 List<Object> result = mapper.processRow(resultSet, 0);
233
234
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
287
288
289
290 public void testProcessRowSqlException() throws Exception
291 {
292
293 ObjectListMapper mapper = new ObjectListMapper(1);
294
295
296 try
297 {
298 mapper.processRow(resultSet, -1);
299
300 fail("Exception expected");
301 }
302 catch (TorqueException e)
303 {
304
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
315
316
317
318 public void testUnknownClass() throws Exception
319 {
320
321 List<Class<?>> classList = new ArrayList<Class<?>>();
322 classList.add(RecordMapper.class);
323 ObjectListMapper mapper = new ObjectListMapper(classList);
324
325
326 try
327 {
328 mapper.processRow(resultSet, -1);
329
330 fail("Exception expected");
331 }
332 catch (IllegalArgumentException e)
333 {
334
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
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
353 List<Object> result = mapper.processRow(resultSet, 0);
354
355
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
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
374 List<Object> result = mapper.processRow(resultSet, 0);
375
376
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
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
394 List<Object> result = mapper.processRow(resultSet, 0);
395
396
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
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
414 List<Object> result = mapper.processRow(resultSet, 0);
415
416
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
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
434 List<Object> result = mapper.processRow(resultSet, 0);
435
436
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
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
454 List<Object> result = mapper.processRow(resultSet, 0);
455
456
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 }