繁体   English   中英

与Mockito一起模拟JPA CriteriaBuilder

[英]Mock a JPA CriteriaBuilder with Mockito

我有一个特别讨厌的JMock checking()块用于我要迁移到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();

我在模拟构建器上发现了这个问题 ,这在一定程度上解决了模拟的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);

这会引发语法错误:

OngoingStubbing类型中的方法thenReturn(Query)不适用于参数(CriteriaQuery)

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

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

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

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

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

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

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

像你一样jMock CriteriaQuery

final CriteriaQuery<String> fakeCriteriaQuery = jMock.mock(CriteriaQuery.class);

你也需要mockito CriteriaQuery

final CriteriaQuery<String> fakeCriteriaQuery = mock(CriteriaQuery.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM