单元测试时静态元模型属性为 null

2024-05-15

我在外部包中有 @Entity 类,这些类也有静态元模型。在我的应用程序的服务类中,我使用这些元模型和 EntityManager/CriteriaBuilder/CriteriaQuery 来检索我的数据。这在运行应用程序时工作得很好。但是,在运行单元测试时,我的元模型及其属性始终为空。

Code...

package com.example.core.entities;

@Entity
@Table(schema = "lookup", name="BookingSystem")
public class BookingSystem implements ILookupEntity, IAuditEntity, Serializable {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id")
  public Integer id;

  @Column(name = "name")
  public String name;

  @Column(name = "code")
  public Integer code;
}

package com.example.core.entities;

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(BookingSystem.class)
public abstract class BookingSystem_ {
  public static volatile SingularAttribute<BookingSystem, Integer> id;
  public static volatile SingularAttribute<BookingSystem, Integer> code;
  public static volatile SingularAttribute<BookingSystem, String> name;
}

在我的应用程序的服务类中的使用...

package com.example.bookingsystem;

@Service
public class BookingService {
  @PersistenceContext
  private EntityManager entityManager;

public void saveBooking(Booking booking) {
//...
  RepositoryQueryBuilder<BookingSystem> bookingSystemSelector = new RepositoryQueryBuilder<>(entityManager, BookingSystem.class);
  List<BookingSystem> bookingSystems = bookingSystemSelector
      .and(BookingSystem_.code, booking.bookingSystem.code) //<-- Here "BookingSystem_.code" is null.
      .getResultList();
  //...
  }
}

“RepositoryQueryBuilder”类只是一个实用程序构建器类,它包装了 EntityManager、CriteriaBuilder 等。基本上是根据这个示例建模的......JPA 标准谓词条件 https://stackoverflow.com/questions/31700942/jpa-criteria-predicate-conditions

单元测试代码...

package com.example.bookingsystem;

public abstract class BaseTestSetup {
  @InjectMocks
  protected BookingService bookingService;

  protected EntityManager entityManager = PowerMockito.mock(EntityManager.class);
  protected CriteriaBuilder criteriaBuilder = PowerMockito.mock(CriteriaBuilder.class);
  protected CriteriaQuery<BookingSystem> criteriaQuery = PowerMockito.mock(CriteriaQuery.class);
  protected Root<BookingSystem> root = PowerMockito.mock(Root.class);

  protected void arrange() {
    when(entityManager.getCriteriaBuilder()).thenReturn(criteriaBuilder);
    when(criteriaBuilder.createQuery(BookingSystem.class)).thenReturn(criteriaQuery);
    when(criteriaQuery.from(Matchers.<Class<BookingSystem>>any())).thenReturn(root);
    when(criteriaQuery.from(Matchers.<EntityType<BookingSystem>>any())).thenReturn(root);
}

}

@RunWith(PowerMockRunner.class)
public class BookingServiceTest extends BaseTestSetup {
  @BeforeClass
  @Override
  public void arrange() {
    super.arrange();

    //...
}

@Test
public void doIt() {
    Booking booking = new Booking();
    booking.id = 12345;
    booking.bookingSystem = new BookingSystem();
    booking.bookingSystem.id = 1;
    booking.bookingSystem.code = 106000;

    bookingService.saveBooking(booking);
  }
}

我看过这个JPA/Hibernate 静态元模型属性未填充 -- NullPointerException https://stackoverflow.com/questions/3854687/jpa-hibernate-static-metamodel-attributes-not-populated-nullpointerexception,但解决方案似乎是“确保实体及其元模型位于同一个包中”,但正如您所看到的,两者都已经在我的“com.example.core.entities”包中。

我在代码中使用所有 bean 和注释驱动的配置(没有持久性或上下文 xml 文件)。就测试而言,我在 IntelliJ 中使用 TestNG 和 PowerMock。

似乎元模型在单元测试期间没有被拾取。有任何想法吗。


加载 hibernate 时会填充静态元模型类。因此,您可以在测试中配置 hibernate 上下文,也可以在方法执行之前手动填充属性。在您的代码中,您可以执行以下操作:

@Test
public void doIt() {
    BookingSystem_.code = new SingularAttributeMock<BookingSystem, Integer>();
    bookingService.saveBooking(booking);
  }
}

班上单一属性模拟可以定制创建以便在您的测试中使用它。您还可以使用任何其他实现单一属性 class.

public class SingularAttributeMock<X, Y> implements SingularAttribute<X, Y> {
   //Overriding methods of SingularAttribute...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试时静态元模型属性为 null 的相关文章

随机推荐

  • 用于创建动画渐变按钮背景的 CSS

    我正在寻找一个CSS规则可以创建一个CSS动画按钮的彩色渐变背景 https i stack imgur com NHqf8 gif 我只是想玩它并这样做 https codepen io prashant nadsoftdev pen b
  • JsonCpp - 当有 json::Value 对象时,我如何知道它的键名称?

    假设我有这个 Json 文件 id 0 使用 jsoncpp 我可以有一个Json Value通过这样做来对象 Json Value node root 0u id 好的 在代码的其他地方 我明白了node对象 我想从中获取一些信息 我可以
  • void *userData 到底是什么?

    在C函数声明中 我看到了这个参数定义 void userData 那么 那到底是什么 我的猜测 虚空说它可以是任意的东西 甚至什么都不是 几乎和objective c的id类似 它只允许传入您喜欢的任何数据结构 userData 前面的星号
  • 左填充 printf 带空格

    使用 printf 时如何在字符串左侧填充空格 例如 我想打印 Hello 前面有 40 个空格 另外 我要打印的字符串由多行组成 我需要单独打印每一行吗 编辑 为了明确起见 我希望在每行之前打印 40 个空格 如果您希望在 40 个字符宽
  • 使用 Matplotlib 绘制二维数组

    所以我有一个二维数组 名为 Data 如下所示 Shape 0 Shape 1 Shape N Scale 0 Value00 Value01 Value0N Scale 1 Value10 Value11 Value1N Scale N
  • jQuery 计算所有文本字段中值的总和

    我有一个订单表单 其中包含大约 30 个包含数值的文本字段 我想计算所有这些模糊值的总和 我知道如何选择所有文本字段 但不知道如何循环它们并添加它们的所有值 document ready function price blur functi
  • 由于 lpcap,CPAN 安装 Net::Pcap 和 Packet 模块失败

    最近 我尝试通过 cpan 安装 perl 模块 Net Packet 和 Net Pcap 但它抱怨找不到 pcap 库 所以我正在搜索 cpan 在安装模块时是否接受外部 lib include 目录 但到目前为止还没有运气 looki
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https
  • 如何更改 SAM 模板中 API 阶段的名称?

    我正在使用 SAM 部署 Lambda 函数 并使其可通过 API Gateway 通过 HTTP 进行调用 大致使用以下模板片段 MyFunction Type AWS Serverless Function Properties Eve
  • 将 C# Xamarin.forms.image 转换为 CGImage

    我正在尝试将 Xamarin forms image 转换为 CoreGraphics CGImage void saveImg Xamarin Forms Image image CoreGraphics CGImage CGImage
  • 创建面向鼠标和触摸的 WPF 应用程序的最佳实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用滑动窗口动画 ggplot 时间序列图

    我正在寻找在不失去分辨率的情况下对长时间序列图进行动画处理的方法 我希望视图能够 平移 数据 显示从开始到结束的滑动子集 假设我有以下内容 library ggplot2 library dplyr library gganimate df
  • 从标签 ID 更改整个 gridview 单元格颜色

    试图弄清楚当我有标签 ID 时如何更改 gridview 单元格的背景颜色
  • Python:使类可迭代

    我继承了一个包含许多大型类的项目 这些类仅由类对象 整数 字符串等 组成 我希望能够检查属性是否存在 而无需手动定义属性列表 是否可以制作一条蟒蛇classiterable 本身使用标准语法 也就是说 我希望能够使用迭代所有类的属性for
  • 从自定义结构/类型公开通用值

    我的一个项目有一个值类型 结构 表示视频格式的自定义标识符字符串 在本例中 它将包含内容类型字符串 但这可能会有所不同 我使用了一个结构体 因此它在传递时可以是强类型的 并对初始字符串值执行一些健全性检查 public struct Vid
  • 正则表达式捕获和替换可以与 Apache DirectoryMatch 指令一起使用吗?

    有谁知道是否可以在 Apache 的 DirectoryMatch 指令中使用正则表达式捕获 我想做类似以下的事情
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 在数据库中建模抽象基类和子类

    我有4个子类 Video Image Note and Form 每一项都包含不同类型的数据 例如 Image类包含磁盘上图像文件的路径和图像属性 以及Form类包含表单字段值 然而 每个项目之间的共同元素是 GPS 坐标和航向 因此我有以
  • 有没有办法将击键发送到节点中的终端?

    我特别想发送 ctrl l 清除终端 这样每次我测试脚本时终端都是干净的 如果您使用的是 Linux console log 033 2J 如果你使用的是 Windows 我认为这可行 将光标设置在 0 0 var util require
  • 单元测试时静态元模型属性为 null

    我在外部包中有 Entity 类 这些类也有静态元模型 在我的应用程序的服务类中 我使用这些元模型和 EntityManager CriteriaBuilder CriteriaQuery 来检索我的数据 这在运行应用程序时工作得很好 但是