2

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

  • 标签(JPA 实体)
  • LabelRepository(实现 PanacheRepository< 标签 > {})

在我的测试类中,我需要模拟labelRepository.find("name", name)。此方法返回一个 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(......);

 .....

 }
}

谢谢你。

4

2 回答 2

1

这是一个很好的观点!

今天,没有简单的方法来模拟 PanacheQuery。根据 Panache 风格,PanacheQuery 由 JPA 查询(用于 Hibernate)或 BSON 查询(​​用于 MongoDB)支持,并且能够处理此查询对象(例如,分页)。

到今天为止,您可能需要在 PanacheQuery 接口上创建一个 Mock 并在您的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 -方法

于 2020-11-12T11:35:12.940 回答
1

最后的工作代码(感谢@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() ,您可以替换它,因为您获得的是整个列表而不仅仅是单个项目。

于 2020-11-18T10:20:25.023 回答