Этот пост показывает, как вы можете java.sql.ResultSet
используя Mockito Его можно использовать для помощи модульному тестированию кода, который выполняет операции с ResultSet
(например, ResultSetExtractor
), не полагаясь на внешний источник данных.
Вы можете создать MockResultSet
, предоставив список имен столбцов и двумерный массив данных. Например:
1
2
3
4
5
6
7
|
var rs = MockResultSet.create( new String[] { "name" , "age" }, //columns new Object[][] { // data { "Alice" , 20 }, { "Bob" , 35 }, { "Charles" , 50 } }); |
Код для MockResultSet
показан ниже (также доступен в моем репозитории GitHub ). Обратите внимание, что я только издевался над несколькими методами, такими как next
, getString
и getObject
но довольно легко getObject
остальные, следуя тому же шаблону.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
public class MockResultSet { private final Map<String, Integer> columnIndices; private final Object[][] data; private int rowIndex; private MockResultSet( final String[] columnNames, final Object[][] data) { // create a map of column name to column index this .columnIndices = IntStream.range( 0 , columnNames.length) .boxed() .collect(Collectors.toMap( k -> columnNames[k], Function.identity(), (a, b) -> { throw new RuntimeException( "Duplicate column " + a); }, LinkedHashMap:: new )); this .data = data; this .rowIndex = - 1 ; } private ResultSet buildMock() throws SQLException { final var rs = mock(ResultSet. class ); // mock rs.next() doAnswer(invocation -> { rowIndex++; return rowIndex < data.length; }).when(rs).next(); // mock rs.getString(columnName) doAnswer(invocation -> { final var columnName = invocation.getArgumentAt( 0 , String. class ); final var columnIndex = columnIndices.get(columnName); return (String) data[rowIndex][columnIndex]; }).when(rs).getString(anyString()); // mock rs.getObject(columnIndex) doAnswer(invocation -> { final var index = invocation.getArgumentAt( 0 , Integer. class ); return data[rowIndex][index - 1 ]; }).when(rs).getObject(anyInt()); final var rsmd = mock(ResultSetMetaData. class ); // mock rsmd.getColumnCount() doReturn(columnIndices.size()).when(rsmd).getColumnCount(); // mock rs.getMetaData() doReturn(rsmd).when(rs).getMetaData(); return rs; } /** * Creates the mock ResultSet. * * @param columnNames the names of the columns * @param data * @return a mocked ResultSet * @throws SQLException */ public static ResultSet create( final String[] columnNames, final Object[][] data) throws SQLException { return new MockResultSet(columnNames, data).buildMock(); } } |
Опубликовано на Java Code Geeks с разрешения Фахда Шарифа, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Java: Mocking a ResultSet с использованием Mockito
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |