单元测试查询 dsl 绑定

问题描述 投票:0回答:1

我有以下使用查询 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 但它仍然说它不能被模拟

java unit-testing mockito querydsl powermockito
1个回答
0
投票

检查 QuerydslPredicateArgumentResolver Spring 如何与活页夹一起工作。

思路是直接使用binder,检查生成的predicate

    @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());
}
© www.soinside.com 2019 - 2024. All rights reserved.