我正在尝试为使用Querydsl(Mysema)库的Spring Boot应用程序的方法设置单元测试。 要测试的方法包括以下代码行:
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
我不知道我必须以哪种方式使之前的代码难以理解才能使其有效。
答案 0 :(得分:0)
每个调用返回对象
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);
......等等
不确定返回对象类请检查,这只是解释的例子。