如何解决如何使用存储库中实现的 CriteriaBuilder 创建模拟?
我有以下存储库方法
public Page<Locale> someMethod(List<String> queryFields,Map<String,Object> filters,Pageable p) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Locale> criteria = builder.createQuery(Locale.class);
Root<Locale> root = criteria.from(Locale.class);
Selection<?>[] s = new Selection<?>[queryFields.size()];
int i = 0;
for (String field : queryFields) {
s[i++] = CriteriaUtils.getField(root,field);
}
criteria.select(builder.construct(Locale.class,s));
Sort sort = p.getSort();
if (null != sort) {
List<Order> list = new ArrayList<Order>(3);
Iterator<Sort.Order> item = sort.iterator();
Sort.Order o = null;
while (item.hasNext()) {
o = item.next();
if (o.isAscending()) {
list.add(builder.asc(root.get(o.getProperty())));
} else {
list.add(builder.desc(root.get(o.getProperty())));
}
}
criteria.orderBy(list);
}
Predicate[] predicates = null;
if (null != filters && filters.size() > 0) {
predicates = new Predicate[filters.size()];
i = 0;
for (Map.Entry<String,Object> entry : filters.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
predicates[i++] = builder.equal(CriteriaUtils.getField(root,key),val);
}
if (null != predicates) {
criteria.where(predicates);
}
}
System.err.println("The value of P: "+p);
List<Locale> content = em.createQuery(criteria).setFirstResult(p.getOffset()).setMaxResults(p.getPageSize())
.getResultList();
Long count = (Long)getCountQuery(predicates).getSingleResult();
return new PageImpl<Locale>(content,p,count);
}
我试图为此创建模拟来测试,但无法做到。得到一个例外。请找到我创建的 Mocks。
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@PowerMockIgnore({ "javax.management.*","sun.*","javax.net.ssl.*" })
@ContextConfiguration(locations = { "classpath*:/spring/test-context.xml" })
public class SomeRepositoryTest {
@Mock
EntityManager em;
@Mock
Query query;
@Mock
CriteriaQuery<Locale> criteriaQuery;
@Mock
CriteriaBuilder criteriaBuilder;
@Mock
Root<Locale> root;
@Mock
Predicate predicate;
@Mock
Selection<Locale> selection;
@Mock
Path<Object> path;
@Mock
CompoundSelection<Locale> compondSelection;
@Mock
TypedQuery<Locale> typedQuery;
@Mock
CriteriaQuery<Long> criteriaQueryLong;
@Mock
TypedQuery<Long> typedQueryLong;
@Mock
Root<Locale> policyRootLong;
@InjectMocks
SomeRepoImpl someRepoImpl;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
List<Locale> listOfLocale = new ArrayList<>();
Locale locale = new Locale("testCode");
listOfLocale.add(locale);
Selection<?>[] s = new Selection<?>[1];
PowerMockito.when(em.getCriteriaBuilder()).thenReturn(criteriaBuilder);
PowerMockito.when(criteriaBuilder.createQuery(Locale.class)).thenReturn(criteriaQuery);
PowerMockito.when(criteriaQuery.from(Locale.class)).thenReturn(root);
PowerMockito.when(criteriaQuery.select(root)).thenReturn(criteriaQuery);
PowerMockito.when(root.get("langCode")).thenReturn(path);
s[0] = path;
PowerMockito.when(criteriaBuilder.construct(Locale.class,s)).thenReturn(compondSelection);
PowerMockito.when(criteriaQuery.select(compondSelection)).thenReturn(criteriaQuery);
PowerMockito.when(em.createQuery(criteriaQuery)).thenReturn(typedQuery);
PowerMockito.when(typedQuery.setFirstResult(0)).thenReturn(typedQuery);
PowerMockito.when(typedQuery.setMaxResults(4)).thenReturn(typedQuery);
PowerMockito.when(typedQuery.getResultList()).thenReturn(listOfLocale);
//For Long
PowerMockito.when(criteriaBuilder.createQuery(Long.class)).thenReturn(criteriaQueryLong);
PowerMockito.when(criteriaQueryLong.from(Locale.class)).thenReturn(policyRootLong);
PowerMockito.when(criteriaQueryLong.select(criteriaBuilder.count(policyRootLong))).thenReturn(criteriaQueryLong);
PowerMockito.when(em.createQuery(criteriaQueryLong)).thenReturn(typedQueryLong);
PowerMockito.when(typedQueryLong.getSingleResult()).thenReturn(2L);
}
@Test
public void performTest() {
List<String> queryFields = new ArrayList<String>();
queryFields.add("one");
queryFields.add("two");
queryFields.add("three");
queryFields.add("four");
Map<String,Object> filters = null;
Pageable page = new PageRequest(0,4);
PowerMockito.when(localerepo.loadLocaleListByCondition(queryFields,filters,page)).thenReturn(new PageImpl<Locale>(new ArrayList<Locale>() {{
add(new Locale("testCode"));
}},page,2));
Page<Locale> result = someRepoImpl.loadLocaleListByCondition(queryFields,page);
Assert.assertNotNull(result);
Assert.assertTrue(result.getContent() != null);
Assert.assertTrue(result.getTotalElements() > 0);
}
}
我刚开始使用 Mocks 进行测试,并编写了上述测试用例来为所提到的存储库方法构建模拟。但是得到如下异常。
java.lang.ClassCastException: class org.springframework.data.domain.PageImpl cannot be cast to class
java.lang.Long (org.springframework.data.domain.PageImpl is in unnamed module of loader
org.powermock.core.classloader.javassist.JavassistMockClassLoader @6483f5ae; java.lang.Long is in module
java.base of loader 'bootstrap')
at com.somepackage.SomeRepoImpl.someMethod(SomeRepoImpl.java:90)
at com.somepackage.SomeRepositoryTest.performTest(SomeRepositoryTest.java:140)
无法理解。我的模拟构造对上述方法是否正确?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。