【问题标题】:NullPointerException while accessing nested objects of Root object in JPA在 JPA 中访问 Root 对象的嵌套对象时出现 NullPointerException
【发布时间】:2021-11-13 00:21:17
【问题描述】:

我正在使用 Mockito(不是 powermock)为我的 Hibernate 的谓词类编写测试用例。

我的方法如下-

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

【问题讨论】:

  • 你是如何定义根对象的?
  • @NareshJ 你好,Naresh,我已经用更多细节编辑了我的查询,以便更好地理解这个场景。

标签: java spring-boot hibernate jpa junit


【解决方案1】:

您可以模拟root 对象并通过返回完全相同类型的每个对象来执行以下操作。例如 obj_1 来自 Target 类,你可以模拟它,然后模拟到 obj_2 直到完成调用链。

when(root.get()).thenReturn(obj_1);
when(obj_1.get()).thenReturn(obj_2);
when(obj_2.get()).thenReturn(obj_3);

这将解决解决方案,如果root 对象很复杂,你可以模拟它,但如果它是pojo,你可以用数据填充它

【讨论】:

  • 我的错误,而不是 object_3,我想返回字符串值,它是来自 Object2 的字段之一的返回类型。它期望在最后返回 javax.persistance.criteria.Path,当 ..Return 代替 obj3 时。我试图覆盖它以返回 String 但我无法成功。
  • @AniruddhDwivedi 然后你可以模拟 Object2 并返回虚拟字符串以避免 NLP 在 get 调用中
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多