如何使用带有 Hibernate-OMR PanacheRepository 的 Quarkus 模拟 PanacheQuery<Entity>
How to mock PanacheQuery<Entity> using Quarkus with Hibernate-OMR PanacheRepository
我将 Quarkus 与 Hibernate-ORM PanacheRepository 一起使用,我需要模拟 PanacheQuery。
我有以下 classes:
- 标签(JPA 实体)
- LabelRepository(实现 PanacheRepository< Label > {})
在我的测试中 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() 方法,您可以替换它,因为您得到的是整个列表,而不仅仅是一个项目。
我将 Quarkus 与 Hibernate-ORM PanacheRepository 一起使用,我需要模拟 PanacheQuery。 我有以下 classes:
- 标签(JPA 实体)
- LabelRepository(实现 PanacheRepository< Label > {})
在我的测试中 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() 方法,您可以替换它,因为您得到的是整个列表,而不仅仅是一个项目。