首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueryDsl的Junit

QueryDsl的Junit
EN

Stack Overflow用户
提问于 2019-07-16 15:54:09
回答 1查看 2.2K关注 0票数 0

我试图为查询dsl编写测试用例,在运行测试用例时得到空指针异常

Dsl类

代码语言:javascript
复制
 QMyClass myClass= QMyClass.myClass;

                    queryFactory = new JPAQueryFactory(em);

                    JPAQuery<?> from = queryFactory.from(myClass);
                    JPAQuery<?> where = from
                            .where(prepdicates);
                    orderBy(orderSpecifier).offset(sortOrder.getOffset())
                            .limit(sortOrder.getPageSize());

**Junit test case:**

import javax.inject.Provider;
import javax.persistence.EntityManager;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.data.jpa.repository.support.QueryDslRepositorySupport;

import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Predicate;
import com.querydsl.jpa.JPQLTemplates;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;

@RunWith(PowerMockRunner.class)
public class MyClass{


    @Mock
    QueryDslRepositorySupport queryDslRepositorySupport;

    @Mock
    EntityManager entityManager;

    @Mock
    JPAQueryFactory queryFactory;
    @Mock
    JPAQuery step1;

    @InjectMocks
    MyClass myClass;




    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

         Provider<EntityManager> provider = new Provider<EntityManager>() {
             @Override
             public EntityManager get() {
                 return entityManager;
             }
         };

         queryFactory = new JPAQueryFactory(JPQLTemplates.DEFAULT, provider);

    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Test
    public void sampleTest() throws Exception {
        QMyClass class= Mockito.mock(QMyClass.class);

        Mockito.when(queryFactory.from(class)).thenReturn(step1);
        Predicate step2 = Mockito.mock(Predicate.class);
        Mockito.when(step1.where(step2)).thenReturn(step1);
        OrderSpecifier step3 = Mockito.mock(OrderSpecifier.class);
        Mockito.when(step1.orderBy(step3)).thenReturn(step1);
        Mockito.when(step1.offset(Mockito.anyLong())).thenReturn(step1);
        Mockito.when(step1.limit(Mockito.anyLong())).thenReturn(step1);

        myClass.method("");
    }
}

当我运行这个测试用例时,我在sampleTest()方法的第2行得到了空指针异常。我在谷歌上搜索了一下,但没有找到这方面的任何文章,我不知道为什么会有这个NE,即使在我嘲笑了queryfacotry之后。

这是痕迹:

代码语言:javascript
复制
java.lang.NullPointerException
    at com.querydsl.core.DefaultQueryMetadata.addJoin(DefaultQueryMetadata.java:154)
    at com.querydsl.core.support.QueryMixin.from(QueryMixin.java:163)
    at com.querydsl.jpa.JPAQueryBase.from(JPAQueryBase.java:77)
    at com.querydsl.jpa.impl.JPAQueryFactory.from(JPAQueryFactory.java:116)
    at 
EN

回答 1

Stack Overflow用户

发布于 2019-07-16 18:06:24

正如我在注释中提到的,您的问题是您不使用模拟,而是使用真正的对象。

从安装方法中删除queryFactory初始化。

代码语言:javascript
复制
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

         Provider<EntityManager> provider = new Provider<EntityManager>() {
             @Override
             public EntityManager get() {
                 return entityManager;
             }
         };

         // remove this line
         // queryFactory = new JPAQueryFactory(JPQLTemplates.DEFAULT, provider);

    }

此外,您还需要更改不能使用的implementation,。

queryFactory = new JPAQueryFactory(em);在您的代码中,因为它不能被模仿。

相反,您可以使用一个返回JPAQueryFactory的方法,

无论是来自另一个类-你可以嘲笑-

或者用同样的方法,那么你就需要监视你的类。

由于您没有为要测试的类添加代码(MyClass --希望是与相同的名为UnitTest?)不同的代码,另一种可能是尝试使用字段或构造器注入(如使用注释所示),但代码中根本不应该为JPAQueryFactory创建对象。

这似乎也是错误的:您应该将模拟注入被测试的类,而不是在您的UnitTest类中。

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)
public class MyClass{

    ...

    @InjectMocks
    MyClass myClass;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57061210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档