1

iBatisDAOフレームワークを使用してアプリケーションのテストを作成しています。アプリはJava1.4環境で実行されているため、すべてのレガシーバージョン(JDK 1.4、JUnit3、iBatis 2.3、およびJMock 1.2)を使用しています。

私のMockObjectTestCaseサブクラスでは、このテストがあります

public void testInsert() throws Exception {
    Mock mockDao = mock(TblPpvFiltersDao.class);
    mockDao.expects(once()).method("insert");

    Mock mockDaoManager = mock(DaoManager.class);
    mockDaoManager.expects(once()).method("getDao")
            .with(eq(TblPpvFiltersDao.class))
            .will(returnValue((TblPpvFiltersDao) mockDao.proxy()));

    PpvFiltersService service = new PpvFiltersServiceImpl(
            (DaoManager) mockDaoManager.proxy());

    service.insert(new PpvFiltersVO());        
}

これは、サービスオブジェクトがDaoManagerDAOオブジェクトを要求し、そのオブジェクトのinsertメソッドを呼び出すことを確認する必要があります。テストはエラーメッセージで失敗します

...DynamicMockError: mockDaoManager: tried to return an incompatible value: 
   expected a com.ibatis.dao.client.Dao but returned a $Proxy0

mockDaoオブジェクトをキャストしようとすると、com.ibatis.dao.client.Daoまたはcom.ibatis.dao.client.template.SqlMapDaoTemplateで終了しClassCastExceptionます。

私は何が欠けていますか?

更新: JDK 1.6、JUnit 4、およびJMock2を使用するようにコードを変換しても何も変わりません。このコード

@Test
public void testInsert() throws Exception {
    final PpvFiltersVO theFilter = new PpvFiltersVO(new Integer(42));
    final TblPpvFiltersDao mockDao = context.mock(TblPpvFiltersDao.class);
    final DaoManager mockDaoManager = context.mock(DaoManager.class);

    context.checking(new Expectations() {{ 
        oneOf (mockDaoManager).getDao(TblPpvFiltersDao.class);
                               will(returnValue(mockDao));
        oneOf (mockDao).insert(theFilter);
    }});

    PpvFiltersService service = new PpvFiltersServiceImpl(mockDaoManager);

    service.insert(theFilter);
}

次のエラーメッセージが表示されます。

java.lang.IllegalStateException: tried to return a $Proxy6 from a method 
    that can only return a com.ibatis.dao.client.Dao

ここで明らかな何かが欠けているかもしれませんが、上記のコードはhttp://www.jmock.org/getting-started.htmlのJMockの例からほぼまっすぐになっています。

何か案は?

修正もちろん、それは明らかなことでした。上記はマーカーインターフェースTblPpvFiltersDaoを拡張する必要があります。com.ibatis.dao.client.Daoドー。

4

1 に答える 1

0

.proxy()でコールを削除しますmockDao。プロキシではなく、getDao()戻りたい。mockDao

また、JMock 1 を使用しているようです。より優れた API を備えた JMock (またはプロトコルがさらに単純なMockito ) に移行することをお勧めします。JMock2 では、コンテキスト オブジェクト (Mockery のインスタンス) を作成し、そこからクラスの実際のインスタンス (Mock 型のインスタンスだけではない) であるモック オブジェクトを作成します。

Mockery ctx = new Mockery();
TblPpvFiltersDao dao = ctx.mock(TblPpvFiltersDao.class);
DaoManager daoManager = ctx.mock(DaoManager.class);

...

詳細については、 http://www.jmock.org/getting-started.htmlを参照してください。

于 2010-04-19T14:16:58.007 に答える