首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Hibernate-OMR PanacheRepository使用Quarkus模拟PanacheQuery<Entity>

如何用Hibernate-OMR PanacheRepository使用Quarkus模拟PanacheQuery<Entity>
EN

Stack Overflow用户
提问于 2020-11-10 08:18:18
回答 2查看 3.4K关注 0票数 3

我在Hibernate-ORM PanacheRepository中使用Quarkus,我需要模拟PanacheQuery。我有以下课程:

Entity)

  • LabelRepository ( PanacheRepository< Label > {})

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

代码语言:javascript
复制
@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(......);

 .....

 }
}

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 11:35:12

这是一个很好的观点!

今天,没有一种简单的方法来模拟PanacheQuery。根据PanacheQuery的风格,JPA查询(针对Hibernate)或BSON查询(对于MongoDB)支持JPA,并且能够对这个查询对象(例如,分页)进行操作。

到目前为止,您可能需要在PanacheQuery接口上创建一个模拟,并在您的when(labelRepository.find("name", "LABEL#01")).thenReturn(......);上返回这个模拟。

假设您只使用PanacheQuery.page()PanacheQuery.list()方法,类似于这样的方法(不经过测试就可以使用):

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2020-11-18 10:20:25

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

代码语言:javascript
复制
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(),可以替换它,因为您正在获取整个列表,而不仅仅是一个项。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64765163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档