首页 > 解决方案 > 在 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 而失败。我该如何解决这个问题?

标签: javaspring-boothibernatejpajunit

解决方案


您可以模拟root对象并通过返回完全相同类型的每个对象来执行以下操作。例如obj_1from 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你可以用数据填充它


推荐阅读