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());
}
これは、サービスオブジェクトがDaoManager
DAOオブジェクトを要求し、そのオブジェクトの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
ドー。