我有以下使用查询dsl绑定的存储库
public interface StatusRepository extends
PagingAndSortingRepository<Status, Long>,
QuerydslPredicateExecutor<Status>,
QuerydslBinderCustomizer<QStatus> {
@Override
default void customize(QuerydslBindings bindings, @NotNull QStatus root) {
bindings.bind(String.class).first((StringPath path, String value) ->
path.likeIgnoreCase(value.replace("_", "[_]")));
}
我正在为customize
方法编写单元测试,遇到了困难
@Test
public void customize() {
QuerydslBindings bindings = mock(QuerydslBindings.class);
QStatus qstatus = mock(QStatus.class);
QuerydslBindings.TypeBinder mock =
PowerMockito.mock(QuerydslBindings.TypeBinder.class);
when(bindings.bind(String.class)).thenReturn(mock);
statusRepository.customize(bindings, qstatusGroup);
}
Cannot mock/spy class org.springframework.data.querydsl.binding.QuerydslBindings$TypeBinder
Mockito cannot mock/spy because :
- final class
我使用powermockito模拟QuerydslBindings。TypeBinder但是它仍然说它不能被模拟
查看QuerydslPredicateArgumentResolver Spring如何与binder一起工作
这个想法是直接使用绑定器并检查生成的谓词@Test
void binding() {
var predicateBuilder = new QuerydslPredicateBuilder(new DefaultConversionService(), SimpleEntityPathResolver.INSTANCE);
var type = ClassTypeInformation.from(Status.class);
var binder = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE)
.createBindingsFor(type, StatusCustomizer.class);
var query = new LinkedMultiValueMap<String, String>();
query.add("param", "value");
Predicate predicate = predicateBuilder.getPredicate(type, query, binder);
System.out.println(predicate.toString());
}