Skip to content

Commit 39bc20f

Browse files
committed
DATAJPA-1657 - Adding UnitTests
I wrote unit tests but unfortunately we can't make integration tests for this change because the HSQL database dialect doesn't work with procedure returning ResultSets. But MySQL, Oracle, Postgres and SQL Server dialects do work with it. Check this project that tests with all those databases: https://github.com/GabrielBB/spring-data-jpa-procedure-tests
1 parent 61ca9c9 commit 39bc20f

File tree

3 files changed

+183
-28
lines changed

3 files changed

+183
-28
lines changed

src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,15 @@
4646
* @author Thomas Darimont
4747
* @author Oliver Gierke
4848
* @author Jens Schauder
49+
* @author Gabriel Basilio
4950
* @see scripts/schema-stored-procedures.sql for procedure definitions.
5051
*/
5152
@Transactional
5253
@ContextConfiguration(classes = StoredProcedureIntegrationTests.TestConfig.class)
5354
@RunWith(SpringJUnit4ClassRunner.class)
5455
public class StoredProcedureIntegrationTests {
5556

56-
private static final String NOT_SUPPORTED = "Stored procedures with ResultSets are currently not supported for any JPA provider";
57+
private static final String NOT_SUPPORTED = "Stored procedures with REF_CURSOR are currently not supported by HSQL dialect";
5758

5859
@PersistenceContext EntityManager em;
5960
@Autowired DummyRepository repository;

src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSourceUnitTests.java

+176-25
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@
2121
import org.mockito.Mock;
2222
import org.mockito.junit.MockitoJUnitRunner;
2323
import org.springframework.core.annotation.AliasFor;
24+
import org.springframework.data.jpa.domain.sample.Dummy;
2425
import org.springframework.data.jpa.domain.sample.User;
2526
import org.springframework.data.repository.query.Param;
2627
import org.springframework.util.ReflectionUtils;
2728

2829
import javax.persistence.EntityManager;
30+
import javax.persistence.ParameterMode;
2931
import java.lang.annotation.Retention;
3032
import java.lang.annotation.RetentionPolicy;
3133
import java.lang.reflect.Method;
34+
import java.util.List;
3235
import java.util.Map;
3336

3437
import static org.assertj.core.api.Assertions.*;
@@ -43,6 +46,7 @@
4346
* @author Diego Diez
4447
* @author Jeff Sheets
4548
* @author Jens Schauder
49+
* @author Gabriel Basilio
4650
* @since 1.6
4751
*/
4852
@RunWith(MockitoJUnitRunner.class)
@@ -65,10 +69,11 @@ public void setup() {
6569
public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithImplicitProcedureName() {
6670

6771
StoredProcedureAttributes attr = creator.createFrom(method("plus1inout", Integer.class), entityMetadata);
68-
72+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
6973
assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
70-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
71-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
74+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
75+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
76+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
7277
}
7378

7479
@Test // DATAJPA-455
@@ -77,9 +82,11 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictN
7782
StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class),
7883
entityMetadata);
7984

85+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
8086
assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
81-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
82-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
87+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
88+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
89+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
8390
}
8491

8592
@Test // DATAJPA-455
@@ -88,9 +95,11 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictP
8895
StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class),
8996
entityMetadata);
9097

98+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
9199
assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
92-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
93-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
100+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
101+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
102+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
94103
}
95104

96105
@Test // DATAJPA-455
@@ -99,9 +108,11 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictP
99108
StoredProcedureAttributes attr = creator
100109
.createFrom(method("explicitPlus1inoutViaProcedureNameAlias", Integer.class), entityMetadata);
101110

111+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
102112
assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
103-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
104-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
113+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
114+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
115+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
105116
}
106117

107118
@Test // DATAJPA-1297
@@ -110,9 +121,11 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictP
110121
StoredProcedureAttributes attr = creator.createFrom(
111122
method("explicitPlus1inoutViaProcedureNameAliasAndOutputParameterName", Integer.class), entityMetadata);
112123

124+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
113125
assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
114-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
115-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
126+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
127+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
128+
assertThat(outputParameter.getName()).isEqualTo("res");
116129
}
117130

118131
@Test // DATAJPA-455
@@ -121,9 +134,11 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithEx
121134
StoredProcedureAttributes attr = creator
122135
.createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO", Integer.class), entityMetadata);
123136

137+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
124138
assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO");
125-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
126-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
139+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
140+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
141+
assertThat(outputParameter.getName()).isEqualTo("res");
127142
}
128143

129144
@Test // DATAJPA-707
@@ -132,9 +147,11 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithEx
132147
StoredProcedureAttributes attr = creator
133148
.createFrom(method("entityAnnotatedCustomNamedProcedureOutputParamNamePlus1IO", Integer.class), entityMetadata);
134149

150+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
135151
assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO");
136-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
137-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("override");
152+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
153+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
154+
assertThat(outputParameter.getName()).isEqualTo("override");
138155
}
139156

140157
@Test // DATAJPA-707
@@ -143,21 +160,30 @@ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithEx
143160
StoredProcedureAttributes attr = creator
144161
.createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO2", Integer.class), entityMetadata);
145162

163+
ProcedureParameter firstOutputParameter = attr.getOutputProcedureParameters().get(0);
164+
ProcedureParameter secondOutputParameter = attr.getOutputProcedureParameters().get(1);
165+
146166
assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO2");
147-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
148-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
149-
assertThat(attr.getOutputParameterTypes().get(1)).isEqualTo(Integer.class);
150-
assertThat(attr.getOutputParameterNames().get(1)).isEqualTo("res2");
167+
168+
assertThat(firstOutputParameter.getMode()).isEqualTo(ParameterMode.OUT);
169+
assertThat(firstOutputParameter.getType()).isEqualTo(Integer.class);
170+
assertThat(firstOutputParameter.getName()).isEqualTo("res");
171+
172+
assertThat(secondOutputParameter.getMode()).isEqualTo(ParameterMode.OUT);
173+
assertThat(secondOutputParameter.getType()).isEqualTo(Integer.class);
174+
assertThat(secondOutputParameter.getName()).isEqualTo("res2");
151175
}
152176

153177
@Test // DATAJPA-455
154178
public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithImplicitlyNamedProcedure() {
155179

156180
StoredProcedureAttributes attr = creator.createFrom(method("plus1", Integer.class), entityMetadata);
157181

182+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
158183
assertThat(attr.getProcedureName()).isEqualTo("User.plus1");
159-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
160-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
184+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
185+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
186+
assertThat(outputParameter.getName()).isEqualTo("res");
161187
}
162188

163189
@Test // DATAJPA-871
@@ -166,9 +192,11 @@ public void aliasedStoredProcedure() {
166192
StoredProcedureAttributes attr = creator
167193
.createFrom(method("plus1inoutWithComposedAnnotationOverridingProcedureName", Integer.class), entityMetadata);
168194

195+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
169196
assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
170-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
171-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
197+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
198+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
199+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
172200
}
173201

174202
@Test // DATAJPA-871
@@ -177,9 +205,104 @@ public void aliasedStoredProcedure2() {
177205
StoredProcedureAttributes attr = creator
178206
.createFrom(method("plus1inoutWithComposedAnnotationOverridingName", Integer.class), entityMetadata);
179207

208+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
180209
assertThat(attr.getProcedureName()).isEqualTo("User.plus1");
181-
assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
182-
assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
210+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
211+
assertThat(outputParameter.getType()).isEqualTo(Integer.class);
212+
assertThat(outputParameter.getName()).isEqualTo("res");
213+
}
214+
215+
@Test // DATAJPA-1657
216+
public void testSingleEntityFrom1RowResultSetAndNoInput() {
217+
218+
StoredProcedureAttributes attr = creator
219+
.createFrom(method("singleEntityFrom1RowResultSetAndNoInput"), entityMetadata);
220+
221+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
222+
assertThat(attr.getProcedureName()).isEqualTo("0_input_1_row_resultset");
223+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
224+
assertThat(outputParameter.getType()).isEqualTo(Dummy.class);
225+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
226+
}
227+
228+
@Test // DATAJPA-1657
229+
public void testSingleEntityFrom1RowResultSetWithInput() {
230+
231+
StoredProcedureAttributes attr = creator
232+
.createFrom(method("singleEntityFrom1RowResultSetWithInput", Integer.class), entityMetadata);
233+
234+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
235+
assertThat(attr.getProcedureName()).isEqualTo("1_input_1_row_resultset");
236+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
237+
assertThat(outputParameter.getType()).isEqualTo(Dummy.class);
238+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
239+
}
240+
241+
242+
@Test // DATAJPA-1657
243+
public void testEntityListFromResultSetWithNoInput() {
244+
245+
StoredProcedureAttributes attr = creator
246+
.createFrom(method("entityListFromResultSetWithNoInput"), entityMetadata);
247+
248+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
249+
assertThat(attr.getProcedureName()).isEqualTo("0_input_1_resultset");
250+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
251+
assertThat(outputParameter.getType()).isEqualTo(List.class);
252+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
253+
}
254+
255+
//
256+
@Test // DATAJPA-1657
257+
public void testEntityListFromResultSetWithInput() {
258+
259+
StoredProcedureAttributes attr = creator
260+
.createFrom(method("entityListFromResultSetWithInput", Integer.class), entityMetadata);
261+
262+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
263+
assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
264+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
265+
assertThat(outputParameter.getType()).isEqualTo(List.class);
266+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
267+
}
268+
269+
@Test // DATAJPA-1657
270+
public void testGenericObjectListFromResultSetWithInput() {
271+
272+
StoredProcedureAttributes attr = creator
273+
.createFrom(method("genericObjectListFromResultSetWithInput", Integer.class), entityMetadata);
274+
275+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
276+
assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
277+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
278+
assertThat(outputParameter.getType()).isEqualTo(List.class);
279+
assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
280+
}
281+
282+
@Test // DATAJPA-1657
283+
public void testEntityListFromResultSetWithInputAndNamedOutput() {
284+
285+
StoredProcedureAttributes attr = creator
286+
.createFrom(method("entityListFromResultSetWithInputAndNamedOutput", Integer.class), entityMetadata);
287+
288+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
289+
assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
290+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
291+
assertThat(outputParameter.getType()).isEqualTo(List.class);
292+
assertThat(outputParameter.getName()).isEqualTo("dummies");
293+
}
294+
295+
@Test // DATAJPA-1657
296+
public void testEntityListFromResultSetWithInputAndNamedOutputAndCursor() {
297+
298+
StoredProcedureAttributes attr = creator
299+
.createFrom(method("entityListFromResultSetWithInputAndNamedOutputAndCursor", Integer.class), entityMetadata);
300+
301+
ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
302+
assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
303+
assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.REF_CURSOR);
304+
assertThat(outputParameter.getType()).isEqualTo(List.class);
305+
assertThat(outputParameter.getName()).isEqualTo("dummies");
183306
}
184307

185308
private static Method method(String name, Class<?>... paramTypes) {
@@ -255,6 +378,34 @@ interface DummyRepository {
255378

256379
@ComposedProcedureUsingAliasFor(emProcedureName = "User.plus1")
257380
Integer plus1inoutWithComposedAnnotationOverridingName(Integer arg);
381+
382+
@Procedure("0_input_1_row_resultset")
383+
// DATAJPA-1657
384+
Dummy singleEntityFrom1RowResultSetAndNoInput();
385+
386+
@Procedure("1_input_1_row_resultset")
387+
// DATAJPA-1657
388+
Dummy singleEntityFrom1RowResultSetWithInput(Integer arg);
389+
390+
@Procedure("0_input_1_resultset")
391+
// DATAJPA-1657
392+
List<Dummy> entityListFromResultSetWithNoInput();
393+
394+
@Procedure("1_input_1_resultset")
395+
// DATAJPA-1657
396+
List<Dummy> entityListFromResultSetWithInput(Integer arg);
397+
398+
@Procedure("1_input_1_resultset")
399+
// DATAJPA-1657
400+
List<Object[]> genericObjectListFromResultSetWithInput(Integer arg);
401+
402+
@Procedure(value = "1_input_1_resultset", outputParameterName = "dummies")
403+
// DATAJPA-1657
404+
List<Dummy> entityListFromResultSetWithInputAndNamedOutput(Integer arg);
405+
406+
@Procedure(value = "1_input_1_resultset", outputParameterName = "dummies", refCursor = true)
407+
// DATAJPA-1657
408+
List<Dummy> entityListFromResultSetWithInputAndNamedOutputAndCursor(Integer arg);
258409
}
259410

260411
@SuppressWarnings("unused")

src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributesUnitTests.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import org.junit.Test;
2222

23+
import javax.persistence.ParameterMode;
24+
2325
/**
2426
* Unit tests for {@link StoredProcedureAttributes}.
2527
*
@@ -31,7 +33,8 @@ public class StoredProcedureAttributesUnitTests {
3133
@Test // DATAJPA-681
3234
public void usesSyntheticOutputParameterNameForAdhocProcedureWithoutOutputName() {
3335

34-
StoredProcedureAttributes attributes = new StoredProcedureAttributes("procedure", null, Long.class);
35-
assertThat(attributes.getOutputParameterNames().get(0)).isEqualTo(SYNTHETIC_OUTPUT_PARAMETER_NAME);
36+
ProcedureParameter outputParameter = new ProcedureParameter(null, ParameterMode.OUT, Long.class);
37+
StoredProcedureAttributes attributes = new StoredProcedureAttributes("procedure", outputParameter);
38+
assertThat(attributes.getOutputProcedureParameters().get(0).getName()).isEqualTo(SYNTHETIC_OUTPUT_PARAMETER_NAME);
3639
}
3740
}

0 commit comments

Comments
 (0)