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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top