如何使用带有 Hibernate-OMR PanacheRepository 的 Quarkus 模拟 PanacheQuery<Entity>

How to mock PanacheQuery<Entity> using Quarkus with Hibernate-OMR PanacheRepository

我将 Quarkus 与 Hibernate-ORM PanacheRepository 一起使用,我需要模拟 PanacheQuery。 我有以下 classes:

在我的测试中 class 我需要模拟 labelRepository.find("name", name)。此方法 return 一个 PanacheQuery,但我不知道如何创建一个新的 PanacheQuery 模拟。

@QuarkusTest
class LabelResourceTest {

  @Inject LabelResource labelResource;
  @InjectMock LabelRepository labelRepository;

  private Label label;
  private List<Label> labels;

  @BeforeEach
  void setUp() {
    label = new Label();
    label.setId(1L);
    label.setName("LABEL#01");
    label.setInheritable(true);

    labels = new ArrayList<>();
    labels.add(label);
  }

 @Test
 void getNameTest() {
  when(labelRepository.find("name", "LABEL#01")).thenReturn(......);

 .....

 }
}

谢谢。

这个观点非常好!

今天,没有简单的方法来模拟 PanacheQuery。根据 Panache 的风格,PanacheQuery 由 JPA 查询(用于 Hibernate)或 BSON 查询(​​用于 MongoDB)支持,并具有对该查询对象执行操作的能力(例如,分页)。

从今天开始,您可能需要在 PanacheQuery 界面上创建一个 Mock,并 return 在您的 when(labelRepository.find("name", "LABEL#01")).thenReturn(......);.

上创建这个模拟

假设您只使用 PanacheQuery.page()PanacheQuery.list() 方法(未测试应该有效):

PanacheQuery query = Mockito.mock(PanacheQuery.class);
Mockito.when(query.page(Mockito.any()).thenReturn(query);
Mockito.when(query.list()).thenReturn(labels);

我将在 Quarkus 上打开一个问题,也许我们可以做得更好(提供 MockQuery)或者我们至少应该记录下来。

另一种解决方案是将您对 PanacheQuery 对象进行的各种调用封装在实体内的专用方法中,并像本例中那样模拟这个方法:https://quarkus.io/guides/hibernate-orm-panache#adding-entity-methods

最后一段代码(感谢@loicmathieu):

PanacheQuery query = Mockito.mock(PanacheQuery.class);
 
Mockito.when(query.page(Mockito.any())).thenReturn(query);
 
Mockito.when(query.firstResultOptional()).thenReturn(Optional.of(label));
 
when(labelRepository.find("name", "LABEL#01")).thenReturn(query);

在我的例子中,我使用了 firstResultOptional() 方法,但如果您需要使用 list() 方法,您可以替换它,因为您得到的是整个列表,而不仅仅是一个项目。