SqlMapClientDaoSupport를 확장하는 DAO를 단위 테스트하는 방법
문제
Spring DA는 DAO 작성에 도움이 됩니다.지속성 프레임워크로 iBATIS를 사용하고 SqlMapClientDaoSupport를 확장할 때 SqlMapClient 모의가 DAO에 대해 설정되어야 하는데 그렇게 할 수 없습니다.SqlMapClientTemplate은 인터페이스가 아니며 EasyMock은 이에 대한 모의를 생성할 수 없습니다.
해결책
DAO와 단위 테스트가 잘 맞지 않습니다!비즈니스 로직을 포함하지 않고 데이터베이스 액세스에 초점을 맞춘 구성 요소의 어떤 것도 조롱하는 것은 의미가 없습니다.대신 통합 테스트를 작성해 보세요.스프링 참조 문서 8.3장을 살펴보세요. http://static.springframework.org/spring/docs/2.5.x/reference/testing.html
다른 팁
이것이 바로 내가 확장하지 않는 이유입니다. SqlMapClientDaoSupport
.대신에 종속성을 주입합니다. SqlMapClientTemplate
(인터페이스로 입력됨 SqlMapClientOperations
).다음은 Spring 2.5의 예입니다.
@Component
public class MyDaoImpl implements MyDao {
@Autowired
public SqlMapClientOperations template;
public void myDaoMethod(BigInteger id) {
int rowcount = template.update("ibatisOperationName", id);
}
}
@Banengusk가 제안한 것처럼 이는 다음을 통해 달성할 수 있습니다. 모키토.그러나 DAO가 Spring을 사용하도록 설정하는 것이 중요합니다. SqlMapClientTemplate
그것은 당신의 모의를 포장합니다 SqlMapClient
.사실은, SqlMapClientTemplate
호출을 위임합니다. SqlMapSession
IBatis 레이어에서.
따라서 몇 가지 추가 모의 설정이 필요합니다.
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);
그런 다음 다음과 같이 동작을 확인할 수 있습니다.
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"));
노력하다 모키토.인터페이스뿐만 아니라 모의 클래스도 허용합니다.