1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.ibatis.submitted.refcursor;
17
18 import static org.junit.jupiter.api.Assertions.*;
19
20 import java.util.ArrayList;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 import org.apache.ibatis.BaseDataTest;
26 import org.apache.ibatis.mapping.Environment;
27 import org.apache.ibatis.session.Configuration;
28 import org.apache.ibatis.session.ResultContext;
29 import org.apache.ibatis.session.ResultHandler;
30 import org.apache.ibatis.session.SqlSession;
31 import org.apache.ibatis.session.SqlSessionFactory;
32 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
33 import org.apache.ibatis.testcontainers.PgContainer;
34 import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
35 import org.junit.jupiter.api.BeforeAll;
36 import org.junit.jupiter.api.Tag;
37 import org.junit.jupiter.api.Test;
38
39
40
41
42 @Tag("TestcontainersTests")
43 class RefCursorTest {
44
45 private static SqlSessionFactory sqlSessionFactory;
46
47 @BeforeAll
48 static void setUp() throws Exception {
49 Configuration configuration = new Configuration();
50 Environment environment = new Environment("development", new JdbcTransactionFactory(),
51 PgContainer.getUnpooledDataSource());
52 configuration.setEnvironment(environment);
53 configuration.addMapper(OrdersMapper.class);
54 sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
55
56 BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(),
57 "org/apache/ibatis/submitted/refcursor/CreateDB.sql");
58 }
59
60 @Test
61 void testRefCursor1() {
62 try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
63 OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
64 Map<String, Object> parameter = new HashMap<>();
65 parameter.put("orderId", 1);
66 mapper.getOrder1(parameter);
67
68 assertNotNull(parameter.get("order"));
69 @SuppressWarnings("unchecked")
70 List<Order> orders = (List<Order>) parameter.get("order");
71 assertEquals(1, orders.size());
72 Order order = orders.get(0);
73 assertEquals(3, order.getDetailLines().size());
74 }
75 }
76
77 @Test
78 void testRefCursor2() {
79 try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
80 OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
81 Map<String, Object> parameter = new HashMap<>();
82 parameter.put("orderId", 1);
83 mapper.getOrder2(parameter);
84
85 assertNotNull(parameter.get("order"));
86 @SuppressWarnings("unchecked")
87 List<Order> orders = (List<Order>) parameter.get("order");
88 assertEquals(1, orders.size());
89 Order order = orders.get(0);
90 assertEquals(3, order.getDetailLines().size());
91 }
92 }
93
94 @Test
95 void shouldUseResultHandlerOnOutputParam() {
96 class OrderResultHandler implements ResultHandler<Order> {
97 private List<Order> orders = new ArrayList<>();
98
99 @Override
100 public void handleResult(ResultContext<? extends Order> resultContext) {
101 Order order = resultContext.getResultObject();
102 order.setCustomerName("Anonymous");
103 orders.add(order);
104 }
105
106 List<Order> getResult() {
107 return orders;
108 }
109 }
110
111 try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
112 OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
113 OrderResultHandler handler = new OrderResultHandler();
114 Map<String, Object> parameter = new HashMap<>();
115 parameter.put("orderId", 1);
116 mapper.getOrder3(parameter, handler);
117
118 assertNull(parameter.get("order"));
119 assertEquals(3, parameter.get("detailCount"));
120 assertEquals("Anonymous", handler.getResult().get(0).getCustomerName());
121 }
122 }
123
124 @Test
125 void shouldNullResultSetNotCauseNpe() {
126 try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
127 OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
128 Map<String, Object> parameter = new HashMap<>();
129 parameter.put("orderId", 99);
130 mapper.getOrder3(parameter, resultContext -> {
131
132 });
133 assertEquals(0, parameter.get("detailCount"));
134 }
135 }
136 }