문제

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"));

노력하다 모키토.인터페이스뿐만 아니라 모의 클래스도 허용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top