Pergunta

Spring DA ajuda na escrita DAOs. Ao usar iBATIS como o framework de persistência, e estendendo SqlMapClientDaoSupport, um mock SqlMapClient deve ser definido para o DAO, mas não posso fazê-lo. SqlMapClientTemplate não é uma interface e EasyMock não pode cria um mock-lo.

Foi útil?

Solução

testes

Dão e do aparelho não se dão muito bem! Isso não faz sentido para qualquer coisa simulada em um componente que não detém qualquer lógica de negócios e está focada em acesso de dados. Você deve tentar, em vez de escrever um teste de integração. Dê uma olhada na documentação de referência primavera, capítulo 8.3: http: //static.springframework.org/spring/docs/2.5.x/reference/testing.html

Outras dicas

Esta razão exata é por isso que não se estendem desde SqlMapClientDaoSupport. Em vez disso, eu injetar uma dependência para o SqlMapClientTemplate (digitado como o SqlMapClientOperations interface). Aqui está um exemplo Spring 2.5:

@Component
public class MyDaoImpl implements MyDao {

    @Autowired
    public SqlMapClientOperations template;

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

Como @Banengusk sugerido - isto pode ser conseguido com Mockito . No entanto, é importante estabelecer que o seu DAO estará usando um SqlMapClientTemplate Primavera que envolve seu SqlMapClient simulada. De fato, SqlMapClientTemplate delega invocações ao SqlMapSession na camada Ibatis.

Por isso é necessária alguma configuração simulada adicional:

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

Podemos então verificar o comportamento assim:

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

Tente Mockito . Ele permite que as classes mock, não só interfaces.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top