Polishing.

Simplify test.

Original pull request: #1356
See #1343
This commit is contained in:
Jens Schauder
2022-10-11 14:20:43 +02:00
committed by Mark Paluch
parent 10ae1e2666
commit 9893884a54

View File

@@ -194,59 +194,87 @@ class StringBasedJdbcQueryUnitTests {
@Test // GH-1212
void convertsEnumCollectionParameterIntoStringCollectionParameter() {
JdbcQueryMethod queryMethod = createMethod("findByEnumTypeIn", Set.class);
BasicJdbcConverter converter = new BasicJdbcConverter(mock(RelationalMappingContext.class),
mock(RelationResolver.class));
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, result -> mock(RowMapper.class),
converter, evaluationContextProvider);
SqlParameterSource sqlParameterSource = forMethod("findByEnumTypeIn", Set.class)
.withArguments(Set.of(Direction.LEFT, Direction.RIGHT)).extractParameterSource();
query.execute(new Object[] { Set.of(Direction.LEFT, Direction.RIGHT) });
ArgumentCaptor<SqlParameterSource> captor = ArgumentCaptor.forClass(SqlParameterSource.class);
verify(operations).query(anyString(), captor.capture(), any(ResultSetExtractor.class));
SqlParameterSource sqlParameterSource = captor.getValue();
assertThat(sqlParameterSource.getValue("directions")).asList().containsExactlyInAnyOrder("LEFT", "RIGHT");
}
@Test // GH-1212
void convertsEnumCollectionParameterUsingCustomConverterWhenRegisteredForType() {
JdbcQueryMethod queryMethod = createMethod("findByEnumTypeIn", Set.class);
BasicJdbcConverter converter = new BasicJdbcConverter(mock(RelationalMappingContext.class),
mock(RelationResolver.class),
new JdbcCustomConversions(List.of(DirectionToIntegerConverter.INSTANCE, IntegerToDirectionConverter.INSTANCE)),
JdbcTypeFactory.unsupported(), IdentifierProcessing.ANSI);
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, result -> mock(RowMapper.class),
converter, evaluationContextProvider);
SqlParameterSource sqlParameterSource = forMethod("findByEnumTypeIn", Set.class) //
.withCustomConverters(DirectionToIntegerConverter.INSTANCE, IntegerToDirectionConverter.INSTANCE)
.withArguments(Set.of(Direction.LEFT, Direction.RIGHT)) //
.extractParameterSource();
query.execute(new Object[] { Set.of(Direction.LEFT, Direction.RIGHT) });
ArgumentCaptor<SqlParameterSource> captor = ArgumentCaptor.forClass(SqlParameterSource.class);
verify(operations).query(anyString(), captor.capture(), any(ResultSetExtractor.class));
SqlParameterSource sqlParameterSource = captor.getValue();
assertThat(sqlParameterSource.getValue("directions")).asList().containsExactlyInAnyOrder(-1, 1);
}
@Test // GH-1212
void doesNotConvertNonCollectionParameter() {
JdbcQueryMethod queryMethod = createMethod("findBySimpleValue", Integer.class);
BasicJdbcConverter converter = new BasicJdbcConverter(mock(RelationalMappingContext.class),
mock(RelationResolver.class));
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, result -> mock(RowMapper.class),
converter, evaluationContextProvider);
SqlParameterSource sqlParameterSource = forMethod("findBySimpleValue", Integer.class) //
.withArguments(1) //
.extractParameterSource();
query.execute(new Object[] { 1 });
ArgumentCaptor<SqlParameterSource> captor = ArgumentCaptor.forClass(SqlParameterSource.class);
verify(operations).query(anyString(), captor.capture(), any(ResultSetExtractor.class));
SqlParameterSource sqlParameterSource = captor.getValue();
assertThat(sqlParameterSource.getValue("value")).isEqualTo(1);
}
QueryFixture forMethod(String name, Class... paramTypes) {
return new QueryFixture(createMethod(name, paramTypes));
}
private class QueryFixture {
private final JdbcQueryMethod method;
private Object[] arguments;
private BasicJdbcConverter converter;
public QueryFixture(JdbcQueryMethod method) {
this.method = method;
}
public QueryFixture withArguments(Object... arguments) {
this.arguments = arguments;
return this;
}
public SqlParameterSource extractParameterSource() {
BasicJdbcConverter converter = this.converter == null //
? new BasicJdbcConverter(mock(RelationalMappingContext.class), //
mock(RelationResolver.class))
: this.converter;
StringBasedJdbcQuery query = new StringBasedJdbcQuery(method, operations, result -> mock(RowMapper.class),
converter, evaluationContextProvider);
query.execute(arguments);
ArgumentCaptor<SqlParameterSource> captor = ArgumentCaptor.forClass(SqlParameterSource.class);
verify(operations).query(anyString(), captor.capture(), any(ResultSetExtractor.class));
return captor.getValue();
}
public QueryFixture withConverter(BasicJdbcConverter converter) {
this.converter = converter;
return this;
}
public QueryFixture withCustomConverters(Object... converters) {
return withConverter(new BasicJdbcConverter(mock(RelationalMappingContext.class), mock(RelationResolver.class),
new JdbcCustomConversions(List.of(converters)), JdbcTypeFactory.unsupported(), IdentifierProcessing.ANSI));
}
}
private JdbcQueryMethod createMethod(String methodName, Class<?>... paramTypes) {
Method method = ReflectionUtils.findMethod(MyRepository.class, methodName, paramTypes);