Mockitoに移行したいJPAクエリ用の特に厄介なJMockchecking()ブロックがあります:
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)
このコードをテストしたり、テストしやすくするために改善したりするにはどうすればよいですか?