Skip to content

Commit ca26063

Browse files
committed
Adapt tests to pagination and slice query detection.
1 parent 0ea86af commit ca26063

File tree

5 files changed

+93
-55
lines changed

5 files changed

+93
-55
lines changed

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCrossAggregateHsqlIntegrationTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import org.junit.jupiter.api.extension.ExtendWith;
2222
import org.springframework.beans.factory.annotation.Autowired;
2323
import org.springframework.context.annotation.Bean;
24+
import org.springframework.context.annotation.ComponentScan;
2425
import org.springframework.context.annotation.Configuration;
26+
import org.springframework.context.annotation.FilterType;
2527
import org.springframework.context.annotation.Import;
2628
import org.springframework.data.annotation.Id;
2729
import org.springframework.data.jdbc.core.mapping.AggregateReference;
@@ -55,7 +57,8 @@ public class JdbcRepositoryCrossAggregateHsqlIntegrationTests {
5557

5658
@Configuration
5759
@Import(TestConfiguration.class)
58-
@EnableJdbcRepositories(considerNestedRepositories = true)
60+
@EnableJdbcRepositories(considerNestedRepositories = true,
61+
includeFilters = @ComponentScan.Filter(value = Ones.class, type = FilterType.ASSIGNABLE_TYPE))
5962
static class Config {
6063

6164
@Autowired JdbcRepositoryFactory factory;

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626

2727
import org.junit.jupiter.api.Test;
2828
import org.junit.jupiter.api.extension.ExtendWith;
29+
2930
import org.springframework.beans.factory.annotation.Autowired;
3031
import org.springframework.context.annotation.Bean;
3132
import org.springframework.context.annotation.ComponentScan;
3233
import org.springframework.context.annotation.Configuration;
34+
import org.springframework.context.annotation.FilterType;
3335
import org.springframework.context.annotation.Import;
3436
import org.springframework.data.annotation.Id;
3537
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
@@ -141,7 +143,8 @@ static class ImmutableWithManualIdEntity {
141143

142144
@Configuration
143145
@ComponentScan("org.springframework.data.jdbc.testing")
144-
@EnableJdbcRepositories(considerNestedRepositories = true)
146+
@EnableJdbcRepositories(considerNestedRepositories = true,
147+
includeFilters = @ComponentScan.Filter(value = CrudRepository.class, type = FilterType.ASSIGNABLE_TYPE))
145148
static class TestConfiguration {
146149

147150
AtomicLong lastId = new AtomicLong(0);

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/StringBasedJdbcQueryMappingConfigurationIntegrationTests.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828

2929
import org.junit.jupiter.api.Test;
3030
import org.junit.jupiter.api.extension.ExtendWith;
31+
3132
import org.springframework.beans.factory.annotation.Autowired;
3233
import org.springframework.context.annotation.Bean;
34+
import org.springframework.context.annotation.ComponentScan;
3335
import org.springframework.context.annotation.Configuration;
36+
import org.springframework.context.annotation.FilterType;
3437
import org.springframework.context.annotation.Import;
3538
import org.springframework.dao.DataAccessException;
3639
import org.springframework.data.annotation.Id;
37-
import org.springframework.data.jdbc.core.convert.EntityRowMapper;
3840
import org.springframework.data.jdbc.repository.config.DefaultQueryMappingConfiguration;
3941
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
4042
import org.springframework.data.jdbc.repository.query.Query;
@@ -63,7 +65,8 @@ public class StringBasedJdbcQueryMappingConfigurationIntegrationTests {
6365

6466
@Configuration
6567
@Import(TestConfiguration.class)
66-
@EnableJdbcRepositories(considerNestedRepositories = true)
68+
@EnableJdbcRepositories(considerNestedRepositories = true,
69+
includeFilters = @ComponentScan.Filter(value = CarRepository.class, type = FilterType.ASSIGNABLE_TYPE))
6770
static class Config {
6871

6972
@Bean

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/QueryAnnotationHsqlIntegrationTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
import org.junit.jupiter.api.extension.ExtendWith;
3131
import org.springframework.beans.factory.annotation.Autowired;
3232
import org.springframework.context.annotation.Bean;
33+
import org.springframework.context.annotation.ComponentScan;
3334
import org.springframework.context.annotation.Configuration;
35+
import org.springframework.context.annotation.FilterType;
3436
import org.springframework.context.annotation.Import;
3537
import org.springframework.dao.DataAccessException;
3638
import org.springframework.data.annotation.Id;
@@ -57,7 +59,8 @@ public class QueryAnnotationHsqlIntegrationTests {
5759

5860
@Configuration
5961
@Import(TestConfiguration.class)
60-
@EnableJdbcRepositories(considerNestedRepositories = true)
62+
@EnableJdbcRepositories(considerNestedRepositories = true,
63+
includeFilters = @ComponentScan.Filter(value = DummyEntityRepository.class, type = FilterType.ASSIGNABLE_TYPE))
6164
static class Config {
6265

6366
@Bean

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

Lines changed: 76 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,31 @@
1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.mockito.Mockito.*;
2020

21+
import java.lang.reflect.Method;
2122
import java.sql.ResultSet;
23+
import java.util.List;
24+
import java.util.Properties;
2225

2326
import org.assertj.core.api.Assertions;
2427
import org.junit.jupiter.api.BeforeEach;
2528
import org.junit.jupiter.api.Test;
2629

2730
import org.springframework.dao.DataAccessException;
31+
import org.springframework.data.domain.Page;
32+
import org.springframework.data.domain.Pageable;
33+
import org.springframework.data.domain.Slice;
2834
import org.springframework.data.jdbc.core.convert.BasicJdbcConverter;
2935
import org.springframework.data.jdbc.core.convert.JdbcConverter;
3036
import org.springframework.data.jdbc.core.convert.RelationResolver;
37+
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
3138
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
32-
import org.springframework.data.relational.repository.query.RelationalParameters;
33-
import org.springframework.data.repository.query.DefaultParameters;
34-
import org.springframework.data.repository.query.Parameters;
39+
import org.springframework.data.repository.Repository;
40+
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
41+
import org.springframework.data.repository.core.support.PropertiesBasedNamedQueries;
3542
import org.springframework.jdbc.core.ResultSetExtractor;
3643
import org.springframework.jdbc.core.RowMapper;
3744
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
45+
import org.springframework.util.ReflectionUtils;
3846

3947
/**
4048
* Unit tests for {@link StringBasedJdbcQuery}.
@@ -47,7 +55,6 @@
4755
*/
4856
public class StringBasedJdbcQueryUnitTests {
4957

50-
JdbcQueryMethod queryMethod;
5158

5259
RowMapper<Object> defaultRowMapper;
5360
NamedParameterJdbcOperations operations;
@@ -57,12 +64,6 @@ public class StringBasedJdbcQueryUnitTests {
5764
@BeforeEach
5865
public void setup() throws NoSuchMethodException {
5966

60-
this.queryMethod = mock(JdbcQueryMethod.class);
61-
62-
Parameters<?, ?> parameters = new RelationalParameters(
63-
StringBasedJdbcQueryUnitTests.class.getDeclaredMethod("dummyMethod"));
64-
doReturn(parameters).when(queryMethod).getParameters();
65-
6667
this.defaultRowMapper = mock(RowMapper.class);
6768
this.operations = mock(NamedParameterJdbcOperations.class);
6869
this.context = mock(RelationalMappingContext.class, RETURNS_DEEP_STUBS);
@@ -72,58 +73,36 @@ public void setup() throws NoSuchMethodException {
7273
@Test // DATAJDBC-165
7374
public void emptyQueryThrowsException() {
7475

75-
doReturn(null).when(queryMethod).getDeclaredQuery();
76+
JdbcQueryMethod queryMethod = createMethod("noAnnotation");
7677

7778
Assertions.assertThatExceptionOfType(IllegalStateException.class) //
78-
.isThrownBy(() -> createQuery()
79+
.isThrownBy(() -> createQuery(queryMethod)
7980
.execute(new Object[] {}));
8081
}
8182

82-
private StringBasedJdbcQuery createQuery() {
83-
84-
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter);
85-
return query;
86-
}
87-
8883
@Test // DATAJDBC-165
8984
public void defaultRowMapperIsUsedByDefault() {
9085

91-
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
92-
doReturn(RowMapper.class).when(queryMethod).getRowMapperClass();
93-
StringBasedJdbcQuery query = createQuery();
94-
95-
assertThat(query.determineRowMapper(defaultRowMapper)).isEqualTo(defaultRowMapper);
96-
}
97-
98-
@Test // DATAJDBC-165, DATAJDBC-318
99-
public void defaultRowMapperIsUsedForNull() {
100-
101-
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
102-
StringBasedJdbcQuery query = createQuery();
86+
JdbcQueryMethod queryMethod = createMethod("findAll");
87+
StringBasedJdbcQuery query = createQuery(queryMethod);
10388

10489
assertThat(query.determineRowMapper(defaultRowMapper)).isEqualTo(defaultRowMapper);
10590
}
10691

10792
@Test // DATAJDBC-165, DATAJDBC-318
10893
public void customRowMapperIsUsedWhenSpecified() {
10994

110-
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
111-
doReturn(CustomRowMapper.class).when(queryMethod).getRowMapperClass();
112-
113-
StringBasedJdbcQuery query = createQuery();
95+
JdbcQueryMethod queryMethod = createMethod("findAllWithCustomRowMapper");
96+
StringBasedJdbcQuery query = createQuery(queryMethod);
11497

11598
assertThat(query.determineRowMapper(defaultRowMapper)).isInstanceOf(CustomRowMapper.class);
11699
}
117100

118101
@Test // DATAJDBC-290
119102
public void customResultSetExtractorIsUsedWhenSpecified() {
120103

121-
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
122-
doReturn(CustomResultSetExtractor.class).when(queryMethod).getResultSetExtractorClass();
123-
124-
createQuery().execute(new Object[] {});
125-
126-
StringBasedJdbcQuery query = createQuery();
104+
JdbcQueryMethod queryMethod = createMethod("findAllWithCustomResultSetExtractor");
105+
StringBasedJdbcQuery query = createQuery(queryMethod);
127106

128107
ResultSetExtractor<Object> resultSetExtractor = query.determineResultSetExtractor(defaultRowMapper);
129108

@@ -136,11 +115,8 @@ public void customResultSetExtractorIsUsedWhenSpecified() {
136115
@Test // DATAJDBC-290
137116
public void customResultSetExtractorAndRowMapperGetCombined() {
138117

139-
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
140-
doReturn(CustomResultSetExtractor.class).when(queryMethod).getResultSetExtractorClass();
141-
doReturn(CustomRowMapper.class).when(queryMethod).getRowMapperClass();
142-
143-
StringBasedJdbcQuery query = createQuery();
118+
JdbcQueryMethod queryMethod = createMethod("findAllWithCustomRowMapperAndResultSetExtractor");
119+
StringBasedJdbcQuery query = createQuery(queryMethod);
144120

145121
ResultSetExtractor<Object> resultSetExtractor = query
146122
.determineResultSetExtractor(query.determineRowMapper(defaultRowMapper));
@@ -151,11 +127,61 @@ public void customResultSetExtractorAndRowMapperGetCombined() {
151127
"RowMapper is not expected to be custom");
152128
}
153129

154-
/**
155-
* The whole purpose of this method is to easily generate a {@link DefaultParameters} instance during test setup.
156-
*/
157-
@SuppressWarnings("unused")
158-
private void dummyMethod() {}
130+
@Test // GH-774
131+
public void sliceQueryNotSupported() {
132+
133+
JdbcQueryMethod queryMethod = createMethod("sliceAll", Pageable.class);
134+
135+
assertThatThrownBy(() -> new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter))
136+
.isInstanceOf(UnsupportedOperationException.class)
137+
.hasMessageContaining("Slice queries are not supported using string-based queries");
138+
}
139+
140+
@Test // GH-774
141+
public void pageQueryNotSupported() {
142+
143+
JdbcQueryMethod queryMethod = createMethod("pageAll", Pageable.class);
144+
145+
assertThatThrownBy(() -> new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter))
146+
.isInstanceOf(UnsupportedOperationException.class)
147+
.hasMessageContaining("Page queries are not supported using string-based queries");
148+
}
149+
150+
private JdbcQueryMethod createMethod(String methodName, Class<?>... paramTypes) {
151+
152+
Method method = ReflectionUtils.findMethod(MyRepository.class, methodName, paramTypes);
153+
return new JdbcQueryMethod(method, new DefaultRepositoryMetadata(MyRepository.class),
154+
new SpelAwareProxyProjectionFactory(), new PropertiesBasedNamedQueries(new Properties()), this.context);
155+
}
156+
157+
private StringBasedJdbcQuery createQuery(JdbcQueryMethod queryMethod) {
158+
return new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter);
159+
}
160+
161+
interface MyRepository extends Repository<Object, Long> {
162+
163+
@Query(value = "some sql statement")
164+
List<Object> findAll();
165+
166+
@Query(value = "some sql statement", rowMapperClass = CustomRowMapper.class)
167+
List<Object> findAllWithCustomRowMapper();
168+
169+
@Query(value = "some sql statement", resultSetExtractorClass = CustomResultSetExtractor.class)
170+
List<Object> findAllWithCustomResultSetExtractor();
171+
172+
@Query(value = "some sql statement", rowMapperClass = CustomRowMapper.class,
173+
resultSetExtractorClass = CustomResultSetExtractor.class)
174+
List<Object> findAllWithCustomRowMapperAndResultSetExtractor();
175+
176+
List<Object> noAnnotation();
177+
178+
@Query(value = "some sql statement")
179+
Page<Object> pageAll(Pageable pageable);
180+
181+
@Query(value = "some sql statement")
182+
Slice<Object> sliceAll(Pageable pageable);
183+
184+
}
159185

160186
private static class CustomRowMapper implements RowMapper<Object> {
161187

0 commit comments

Comments
 (0)