2008-09-21 3 views
5

DA는 DAO 작성에 도움이됩니다. 지속성 프레임 워크로 iBATIS를 사용하고 SqlMapClientDaoSupport를 확장 할 때, SqlMapClient 모의가 DAO에 대해 설정되어야하지만 할 수 없습니다. SqlMapClientTemplate은 인터페이스가 아니기 때문에 EasyMock은 모의 객체를 생성 할 수 없습니다.SqlMapClientDaoSupport를 확장하는 DAO 단위 테스트 방법

답변

1

DAO 및 단위 테스트가 잘 진행되지 않습니다! 비즈니스 로직을 보유하지 않고 데이터베이스 액세스에 중점을 둔 구성 요소에서 모의하는 것은 의미가 없습니다. 대신 통합 테스트를 작성해야합니다. 스프링 참조 문서, 8.3 장을보십시오 : http://static.springframework.org/spring/docs/2.5.x/reference/testing.html

+0

테스트. 그러므로 나는 DAO가 단위 테스트를 받아서는 안된다고 말하는 것이 합리적이라고 생각하지 않는다. 모든 것은 문제의 클래스에 달려있다. – teabot

0

시도 Mockito보십시오. 그것은 모의 수업뿐만 아니라 인터페이스 수 있습니다.

1

정확한 이유는 내가 SqlMapClientDaoSupport에서 연장되지 않는 이유입니다. 대신 SqlMapClientTemplate (인터페이스 SqlMapClientOperations으로 입력)에 의존성을 주입합니다. 다음은 스프링 2.5 예제 : @Banengusk으로

@Component 
public class MyDaoImpl implements MyDao { 

    @Autowired 
    public SqlMapClientOperations template; 

    public void myDaoMethod(BigInteger id) { 
     int rowcount = template.update("ibatisOperationName", id); 
    } 
} 
+2

그리고 Composition이 Inheritance보다 낫다는 또 다른 이유. –

1

제안 - 이것은 Mockito으로 달성 될 수있다. 그러나 귀하의 DAO가 귀하의 모의를 으로 감싸는 스프링 SqlMapClientTemplate을 사용한다는 것을 확증하는 것이 중요합니다. 사실, SqlMapClientTemplate은 IBatis 레이어의 SqlMapSession에 대한 호출을 위임합니다.

은 따라서 몇 가지 추가 모의 설치가 필요합니다

mockSqlMapSession = mock(SqlMapSession.class); 
mockDataSource = mock(DataSource.class); 

mockSqlMapClient = mock(SqlMapClient.class); 
when(mockSqlMapClient.openSession()).thenReturn(mockSqlMapSession); 
when(mockSqlMapClient.getDataSource()).thenReturn(mockDataSource); 

dao = new MyDao(); 
dao.setSqlMapClient(mockSqlMapClient); 

우리는 다음과 같이 동작을 확인할 수 있습니다 : 나는 당신의 논리를 볼 수 있지만, 내가 단위에서 이익을 얻을 수 DAO 기능을 직시 할 수

Entity entity = new EntityImpl(4, "someField"); 
dao.save(entity); 

ArgumentCaptor<Map> params = ArgumentCaptor.forClass(Map.class); 
verify(mockSqlMapSession).insert(eq("insertEntity"), params.capture()); 
assertEquals(3, params.getValue().size()); 
assertEquals(Integer.valueOf(4), params.getValue().get("id")); 
assertEquals("someField", params.getValue().get("name")); 
assertNull(params.getValue().get("message"));