gpt4 book ai didi

java - 使用 Mockito 模拟 JPA CriteriaBuilder

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:53 27 4
gpt4 key购买 nike

我有一个特别讨厌的 JMock checking() block 用于 我想迁移到 Mockito 的 JPA 查询:

Mockery jMock = new Mockery();
final EntityManager fakeEntityManager = jMock.mock(EntityManager.class);
final CriteriaBuilder fakeCriteriaBuilder = jMock.mock(CriteriaBuilder.class);
final CriteriaQuery<String> fakeCriteriaQuery = jMock.mock(CriteriaQuery.class);
jMock.checking(new Expectations() {{
oneOf(fakeEntityManager).getCriteriaBuilder(); will(returnValue(fakeCriteriaBuilder));
oneOf(fakeCriteriaBuilder).createQuery(String.class); will(returnValue(fakeCriteriaQuery));
oneOf(fakeCriteriaQuery).from(Archiveusergrouplicences.class);
oneOf(fakeCriteriaQuery).select(with(any(Selection.class)));
oneOf(fakeCriteriaBuilder).isNotNull(with(any(Expression.class)));
oneOf(fakeCriteriaQuery).where(with(any(Expression.class)));
oneOf(fakeEntityManager).createQuery(fakeCriteriaQuery);
// Return an empty resultset
}});

被测试的代码如下所示:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<String> criteria = builder.createQuery(String.class);

Root<Archiveusergrouplicences> institution = criteria.from(Archiveusergrouplicences.class);
criteria.select(institution.get(Archiveusergrouplicences_.usergroupid));
criteria.where(builder.isNotNull(institution.get(Archiveusergrouplicences_.usergroupid)));

List<String> result = entityManager.createQuery(criteria).getResultList();

我找到了 this question on mocking builders ,这在某种程度上解决了模拟的 CriteriaBuilder 部分;但我的主要问题是使用模拟对象作为另一个模拟的 .thenReturn() 值 - Mockito 似乎不允许这样做。例如,对于行:

CriteriaQuery<String> criteria = builder.createQuery(String.class);

我想返回模拟 CriteriaQuery 对象,如下所示:

CriteriaQuery<String> fakeCriteriaQuery = mock(CriteriaQuery.class, RETURNS_DEEP_STUBS);
when(entityManager.createQuery(anyString())).thenReturn(fakeCriteriaQuery);

这会引发语法错误:

The method thenReturn(Query) in the type OngoingStubbing is not applicable for the arguments (CriteriaQuery)

我该如何测试这段代码,或者如何改进它以使其更易于测试?

最佳答案

事实证明,您可以从其他模拟中返回模拟 - 只要您设置了正确的参数!我试图断言:

when(entityManager.createQuery(anyString())).thenReturn(fakeCriteriaQuery);

当我真正想要的是传递一个类时:

when(fakeCriteriaBuilder.createQuery(String.class)).thenReturn(fakeCriteriaQuery);

错误是 Mockito 以神秘的方式告诉我我搞砸了我的期望。

但是,我可能会考虑重写此测试而不是翻译最初编写的内容。正如一些人指出的那样;通常最好避免以这种方式模拟库,而且要检查的条件相当模糊。

关于java - 使用 Mockito 模拟 JPA CriteriaBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9191096/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com