2008-09-21 13 views

Respuesta

1

¡Las pruebas DAO y unitarias no se llevan bien! Eso no tiene sentido para burlarse de algo en un componente que no tiene ninguna lógica comercial y se centra en el acceso a la base de datos. Debería intentar escribir una prueba de integración. Eche un vistazo a la documentación de referencia de primavera, capítulo 8.3: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html

+0

Aunque puedo ver a su lógica, puedo imaginar funcionalidad DAO que podrían beneficiarse de la unidad pruebas. Por lo tanto, no creo que sea justo decir que los DAO no deben someterse a pruebas unitarias, todo depende de la clase en cuestión. – teabot

0

Pruebe Mockito. Permite clases simuladas, no solo interfaces.

1

Esta razón exacta es por qué no extiendo de SqlMapClientDaoSupport. En cambio, inyecto una dependencia al SqlMapClientTemplate (escrito como la interfaz SqlMapClientOperations). He aquí un ejemplo de Primavera 2.5:

@Component 
public class MyDaoImpl implements MyDao { 

    @Autowired 
    public SqlMapClientOperations template; 

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

Y otra razón por la cual la Composición es mejor que la Herencia. –

1

Como @Banengusk sugirió - esto se puede lograr con Mockito. Sin embargo, es importante establecer que su DAO utilizará un resorte SqlMapClientTemplate que envuelva su simulacro SqlMapClient. De hecho, SqlMapClientTemplate delega invocaciones al SqlMapSession en la capa IBatis.

Por lo tanto se requiere alguna configuración 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 entonces verificar el comportamiento de este modo:

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