我在Hibernate-ORM PanacheRepository中使用Quarkus,我需要模拟PanacheQuery。我有以下课程:
Entity)
在我的测试类中,我需要模拟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(......);
.....
}
}谢谢。
发布于 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()方法,类似于这样的方法(不经过测试就可以使用):
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。
发布于 2020-11-18 10:20:25
最后一段代码(感谢@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(),可以替换它,因为您正在获取整个列表,而不仅仅是一个项。
https://stackoverflow.com/questions/64765163
复制相似问题