java - 在 JPA 中访问 Root 对象的嵌套对象时出现 NullPointerException
问题描述
我正在使用 Mockito(不是 powermock)为我的 Hibernate 的 Predicate 类编写测试用例。
我的方法如下——
buildXYZQuery(Root<?> root, Filter filter, CriteriaBuilder cb, Predicate where, String Login) {
Predicate predicate1 = cb.like(cb.upper(root.get("object1")), "VALUE1");
Predicate predicate2 = cb.like(cb.upper(root.get("object1")), "VALUE1");
Predicate predicate3 = cb.like(cb.upper(root.get("object1").get("object2").get("DataMember_Of_Object2_Returning_String_Value")), "VALUE1");
where = cb.and(predicate1, predicate2, predicate3);
return where;
}
对于这种方法,我正在尝试将 junit 测试用例编写为-
public class HibPaginationTest {
@InjectMocks
HibPagination pagn = new HibPagination();
Root root = new Root() {
@override
public EntityType getModel() { return null; }
@override
public Path get(String s) { return null; }
.....
.....
// all methods from javax.persistence.criteria.Root interface
};
Predicate predicate = new Predicate() {
// all methods from javax.persistence....Predicate
};
CriteriaBuilder cb = new CriteriaBuilder() {
.......
};
@Test
public void buildXYZQueryTest() {
pagn.buildXYZQuery(root, filter, cb, where, "test_user");
}
}
在这里,我的测试用例在尝试执行用于访问嵌套对象 (root.get().get().get()) 的谓词 3 时因 NPE 而失败。我该如何解决这个问题?
解决方案
您可以模拟root
对象并通过返回完全相同类型的每个对象来执行以下操作。例如obj_1
from classTarget
你可以模拟它,然后模拟到obj_2
完成调用链。
when(root.get()).thenReturn(obj_1);
when(obj_1.get()).thenReturn(obj_2);
when(obj_2.get()).thenReturn(obj_3);
这将解决解决方案,如果root
对象很复杂,你可以模拟它,但如果是这样,pojo
你可以用数据填充它
推荐阅读
- feed - GetStreamIO - 根据定义/特殊/自定义聚合创建提要
- asp.net - IIS ASP.NET 32 位应用程序池无法处理请求
- sql - 当列的顺序不同时创建一个 UNION ALL 查询
- flutter - 在 Flutter 中创建一个可实例化的 Widget 列表
- java - GSON MalformedJsonException 错误消息中的路径是什么?
- c# - 以编程方式添加到 DataGridView 的 ComboBox 直到单元格失去焦点然后再次单击后才会打开
- javascript - 如何在jquery中提交表单之前区分两次特定点击?
- project-reactor - 为什么 doOnCancel 方法会阻止同级 doOnCancel ,即使它们位于不同的调度程序上?
- vba - VBA界面未在监视窗口中显示属性
- reactjs - 在 Ant Design 库中编辑 Transfer 的 header 组件