iBatis DAO 프레임 워크를 사용하여 응용 프로그램에 대한 테스트를 작성하고 있습니다. 응용 프로그램은 자바 1.4 환경에서 실행되므로 모든 레거시 버전 (JDK 1.4, JUnit3, iBatis 2.3 및 JMock 1.2)을 사용하고 있습니다. 내 MockObjectTestCase
서브 클래스에서JMock 모의 객체가 다른 모의 객체를 반환 할 수 있습니까?
나는 서비스 객체는 DAO 객체의 DaoManager
요청합니다 확인하고 그 위에 insert
메소드를 호출해야이 테스트
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());
}
있습니다. 테스트는 ClassCastException
에서 com.ibatis.dao.client.Dao
또는 com.ibatis.dao.client.template.SqlMapDaoTemplate
끝 하나에 어느 mockDao
개체를 캐스팅하려고 오류 메시지
...DynamicMockError: mockDaoManager: tried to return an incompatible value:
expected a com.ibatis.dao.client.Dao but returned a $Proxy0
실패합니다.
무엇이 누락 되었습니까?
업데이트 : 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
을 확장해야합니다. 오.
아니요, .proxy() 부분을 제외하면 원하는 것이 아닌 org.jmock.Mock가 생깁니다. – agnul
왜? mockDaoManager가 mockDao를 반환하면, mockDao.insert()가 호출 될 것이라는 기대를 테스트 할 수 있습니다. 그게 시험의 요점이지, 그치? –
이것은 JMock 1.2이므로, mockDaoManager와 mockDao는 모두 org.jmock.Mock의 인스턴스입니다. proxy() 호출은 "실제"모의 객체를 얻기 위해 필요합니다. http://www.jmock.org/jmock1-getting-started.html – agnul