2010-04-19 7 views
1

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을 확장해야합니다. 오.

답변

0

.proxy() 통화를 삭제하십시오. getDao()mockDao이고 프록시는 반환하지 않기를 원합니다.

또한 JMock 1을 사용하고있는 것으로 보입니다. JMock을 더 나은 API (심지어 프로토콜이 더 단순한 Mockito)로 옮기는 것이 좋습니다. JMock2에서는 모의 객체를 생성하는 컨텍스트 객체 (Mockery의 인스턴스)를 생성한다.이 객체는 모의 객체의 인스턴스가 아닌 클래스의 실제 인스턴스이다.

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

... 

자세한 내용은 http://www.jmock.org/getting-started.html을 참조하십시오.

+0

아니요, .proxy() 부분을 제외하면 원하는 것이 아닌 org.jmock.Mock가 생깁니다. – agnul

+0

왜? mockDaoManager가 mockDao를 반환하면, mockDao.insert()가 호출 될 것이라는 기대를 테스트 할 수 있습니다. 그게 시험의 요점이지, 그치? –

+0

이것은 JMock 1.2이므로, mockDaoManager와 mockDao는 모두 org.jmock.Mock의 인스턴스입니다. proxy() 호출은 "실제"모의 객체를 얻기 위해 필요합니다. http://www.jmock.org/jmock1-getting-started.html – agnul

관련 문제