Unité testant une classe DAO utilisant Spring JDBC
J'ai plusieurs objets DAO qui sont utilisés pour récupérer des informations à partir d'une base de données et je vraiment envie d'écrire quelques tests automatisés pour eux, mais je vais avoir un moment difficile de déterminer comment le faire.
Je suis en utilisant le Printemps JdbcTemplate
pour exécuter la requête réelle (via une déclaration préparée à l'avance) et de cartographier les résultats pour le modèle objet (via le RowMapper
classe).
Si je devais écrire des tests unitaires, je ne suis pas sûr de comment je pourrait/devrait se moquer des objets. Par exemple, il n'y a que des lectures, je voudrais utiliser la connexion de base de données et de ne pas se moquer de la jdbcTemplate, mais je ne suis pas sûr que c'est un droit.
Voici le (simplifié) code pour le plus simple DAO du lot:
/**
* Implementation of the {@link BusinessSegmentDAO} interface using JDBC.
*/
public class GPLBusinessSegmentDAO implements BusinessSegmentDAO {
private JdbcTemplate jdbcTemplate;
private static class BusinessSegmentRowMapper implements RowMapper<BusinessSegment> {
public BusinessSegment mapRow(ResultSet rs, int arg1) throws SQLException {
try {
return new BusinessSegment(rs.getString(...));
} catch (SQLException e) {
return null;
}
}
}
private static class GetBusinessSegmentsPreparedStatementCreator
implements PreparedStatementCreator {
private String region, cc, ll;
private int regionId;
private GetBusinessSegmentsPreparedStatementCreator(String cc, String ll) {
this.cc = cc;
this.ll = ll;
}
public PreparedStatement createPreparedStatement(Connection connection)
throws SQLException {
String sql = "SELECT ...";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, cc);
ps.setString(2, ll);
return ps;
}
}
public GPLBusinessSegmentDAO(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
public Collection<BusinessSegment> getBusinessSegments(String cc, String ll) {
return jdbcTemplate.query(
new GetBusinessSegmentsPreparedStatementCreator(cc, ll),
new BusinessSegmentRowMapper());
}
}
Toute idée serait la bienvenue.
Merci!
source d'informationauteur Alex Ciminian
Vous devez vous connecter pour publier un commentaire.
Regardez les liens ci-dessous:
Espère que ça aide.
EDIT:
Ici est la GitHub version de RowMapperTests pour référence facile.
Je recommande briser votre dépendance à
JdbcTemplate
classe, et à l'aide de laJdbcOperations
interface, par exempleVotre test unitaire peut invoquer le deuxième constructeur, en passant dans un simulacre de
JdbcOperations
objet. Depuis toutes DB opérations sont effectuées via l'jdbc
objet, vous pouvez vous moquer de qui assez facilement.Votre code en direct peut appeler le premier constructeur comme avant.
D'écrire un vrai test unitaire pour cela, vous ne seriez pas en toucher une vraie base de données.
Cependant, vous pouvez trouver qu'il est plus pratique de passer dans une véritable source de données à votre sous-jacente db, et le test de la getBusinessSegments() la méthode renvoie la valeur 0, 1 et de nombreux résultats en fonction de la cc et de remplir les valeurs que vous transmettez.
Une autre option utile de l'examiner serait de passer dans une source de données d'un intégré à Java DB qui a été initialisé avec votre schéma dans une installation/@Avant méthode. Je suppose que ce que vous voulez vraiment tester est la requête SELECT... correctement les cartes pour le schéma, donc, un tel test permettrait d'intercepter les erreurs qui surviennent lors de l'exécution lorsque le schéma, disons, les changements.