我试图为查询dsl编写测试用例,在运行测试用例时得到空指针异常
Dsl类
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之后。
这是痕迹:
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 发布于 2019-07-16 18:06:24
正如我在注释中提到的,您的问题是您不使用模拟,而是使用真正的对象。
从安装方法中删除queryFactory初始化。
@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类中。
@RunWith(PowerMockRunner.class)
public class MyClass{
...
@InjectMocks
MyClass myClass;https://stackoverflow.com/questions/57061210
复制相似问题