5

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)

このコードをテストしたり、テストしやすくするために改善したりするにはどうすればよいですか?

4

2 に答える 2

3

正しい引数を設定する限り、他のモックからモックを返すことができます。私は主張しようとしていました:

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

私が実際に望んでいたのは、クラスに合格することでした。

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

エラーは、私が期待を台無しにしたことを私に伝えるモッキトの不可解な方法でした。

ただし、最初に書かれたものを翻訳するのではなく、このテストを書き直すことを検討するかもしれません。一部の人が指摘しているように、多くの場合、この方法でライブラリをモックすることは避けたほうがよいでしょう。また、チェックされる条件はかなりあいまいです。

于 2012-02-08T11:12:08.290 に答える
0

あなたのようにjMockCriteriaQuery

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

CriteriaQueryもモックする必要があります

final CriteriaQuery<String> fakeCriteriaQuery = mock(CriteriaQuery.class);
于 2012-02-08T10:14:47.403 に答える