Junit, Mockito и Querydsl (Mysema) для издевательства над JPAQueryFactory - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь настроить модульный тест для метода приложения Spring Boot, использующего библиотеку Querydsl (Mysema).Тестируемый метод включает следующие строки кода:

JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QEntity q = QEntity.entity;

long count = queryFactory.from(q)
    .select(q.anInteger)
    .where(aBooleanExpression)
    .fetchCount();

В классе модульного теста я пишу метод настройки, помеченный @ Before , где я делаю следующее:

    JPAQueryFactory queryFactory = Mockito.mock(JPAQueryFactory.class, Mockito.RETURNS_DEEP_STUBS);

    QEntity q = QEntity.etity;
    BooleanExpression aBooleanExpression = ... // The same as used in the method under test

    Mockito
        .when(((JPAQuery<Integer>) queryFactory
                .from(q)
                .select(q.anInteger))
                .where(aBooleanExpression)
                .fetchCount()
        ).thenReturn(1L);

Нет ошибок компиляции, но когда я запускаю тест, я получаю исключение:

java.lang.ClassCastException: com.querydsl.core.support.QueryBase$$EnhancerByMockitoWithCGLIB$$6824f47d cannot be cast to com.querydsl.jpa.impl.JPAQuery

Я не знаю, каким образом я должен рефрактировать предыдущий код, чтобы сделатьэто работает.

1 Ответ

0 голосов
/ 25 мая 2018

Каждый возвращаемый объект вызова

queryFactory.from(q)
            .select(q.anInteger))
            .where(aBooleanExpression)
            .fetchCount()

, в вашем случае вы должны шаг за шагом издеваться:

 JPAQuery step1 = Mockito.mock(JPAQuery.class);
 Mockito.when(queryFactory.from(q)).thenReturn(step1);
 JPAQuery step2 = Mockito.mock(JPAQuery.class);
 Mockito.when(step1.select(q.anInteger)).thenReturn(step2);
 JPAQuery step3 = Mockito.mock(JPAQuery.class);
 Mockito.when(step2.where(aBooleanExpression)).thenReturn(step3);

... и так далее

Не уверен насчет класса возвращаемого объекта, пожалуйста, проверьте, это пример только для объяснений.

...