Comment tester à l'unité un DAO qui étend SqlMapClientDaoSupport
Question
Spring DA aide à l’écriture des DAO. Lors de l'utilisation de iBATIS comme infrastructure de persistance et de l'extension de SqlMapClientDaoSupport, une maquette SqlMapClient doit être définie pour le DAO, mais je ne peux pas le faire. SqlMapClientTemplate n'est pas une interface et EasyMock ne peut en créer une fausse.
La solution
DAO et les tests unitaires ne s’entendent pas bien! Cela n’a aucun sens de simuler quoi que ce soit dans un composant qui ne contient aucune logique métier et est centré sur l’accès à une base de données. Vous devriez plutôt essayer d’écrire un test d’intégration. Consultez la documentation de référence de printemps, chapitre 8.3: http: //static.springframework.org/spring/docs/2.5.x/reference/testing.html
Autres conseils
C’est précisément pour cette raison que je n’étends pas à partir de SqlMapClientDaoSupport
. Au lieu de cela, j'injecte une dépendance dans SqlMapClientTemplate
(tapé comme interface SqlMapClientOperations
). Voici un exemple de Spring 2.5:
@Component
public class MyDaoImpl implements MyDao {
@Autowired
public SqlMapClientOperations template;
public void myDaoMethod(BigInteger id) {
int rowcount = template.update("ibatisOperationName", id);
}
}
Comme @Banengusk l'a suggéré - cela peut être réalisé avec Mockito . Toutefois, il est important d’établir que votre DAO utilisera un Spring SqlMapClientTemplate
qui enveloppe votre modèle SqlMapClient
. En effet, SqlMapClientTemplate
délègue des appels au SqlMapSession
de la couche IBatis.
Par conséquent, une configuration fictive supplémentaire est requise:
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);
Nous pouvons ensuite vérifier le comportement comme suit:
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"));
Essayez Mockito . Cela permet de simuler des classes, pas seulement des interfaces.