IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tests et Performance Java Discussion :

Classe de test avec héritage et appel du constructeur


Sujet :

Tests et Performance Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Points : 70
    Points
    70
    Par défaut Classe de test avec héritage et appel du constructeur
    Salut,

    J'essaye d'implémenter un Junit qui au démarrage charge la base de donnée oracle, exécute un traitement, les tests puis fait le ménage dans la base.
    Je dois faire plusieurs tests similaires avec quelques petits delta, j'ai donc décider de mutualiser dans une classe mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    public abstract class BatchTest {
     
    	private Connection connection = null;
     
    	public BatchTest(String configFile, String dataFile){
    		try{
    			loadData(configFile, dataFile);
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	private void loadData(String configFile, String dataFile)throws Exception  {
    		File aPropertyFile = new File(configFile);
    		FileInputStream anFileInputStream = new FileInputStream(aPropertyFile);
    		PropertyResourceBundle aResource = new PropertyResourceBundle(anFileInputStream);
     
    		String nomDriver = aResource.getString("driverName");
    		String url = aResource.getString("url");
    		String login = aResource.getString("login");
    		String password = aResource.getString("password");
     
    		RandomAccessFile myAcces = null;
    		File myFile = new File(dataFile);
    		String aLine = null;
    		PreparedStatement aStatement = null;
     
    		try{
    		    Class.forName(nomDriver); 
    		}catch(ClassNotFoundException cnfe){
    		    System.out.println("La classe "+nomDriver+" n'a pas été trouvée");
    		    cnfe.printStackTrace();
    		}
     
    		try{
     
    			connection = DriverManager.getConnection(url,login,password);
    			connection.setAutoCommit(false);
     
    			myAcces = new RandomAccessFile(myFile,"r");
    			aLine = myAcces.readLine();
    			//chargement des données de test
    			while(aLine != null && !aLine.equals("")){
    				aStatement = connection.prepareStatement(aLine);
    				aStatement.executeUpdate();
    				aStatement.close();
    				aLine = myAcces.readLine();
    			}
    			connection.commit();
     
    		}
    		catch(SQLException sqle){
    			connection.rollback();
    			System.out.println("Exception SQL : ");
    			while (sqle != null) {
    				String message = sqle.getMessage();
    				String sqlState = sqle.getSQLState();
    				int errorCode = sqle.getErrorCode();
    				System.out.println("Message = "+message);
    				System.out.println("SQLState = "+sqlState);
    				System.out.println("ErrorCode = "+errorCode);
    				sqle.printStackTrace();
    				sqle = sqle.getNextException();
    			}
    		}
    		catch(FileNotFoundException fe) {
    			connection.rollback();
    			System.out.println("Fichier" + myFile.toString() + " non trouvé");
    		}
    		finally{
    			myAcces.close();
            }
    	}
     
    	@AfterClass
    	private void clean() throws Exception {
    		try {
    			if(!connection.isClosed()) {
    				cleanData(connection);
    			}
    		}catch(SQLException sqle){
    			connection.rollback();
    			System.out.println("Exception SQL : ");
    			while (sqle != null) {
    				String message = sqle.getMessage();
    				String sqlState = sqle.getSQLState();
    				int errorCode = sqle.getErrorCode();
    				System.out.println("Message = "+message);
    				System.out.println("SQLState = "+sqlState);
    				System.out.println("ErrorCode = "+errorCode);
    				sqle.printStackTrace();
    				sqle = sqle.getNextException();
    			}
    		}
    		finally{
    			if(!connection.isClosed()){
    				try{
    					connection.commit();
    					connection.close();
    				}catch(Exception e){
    					e.printStackTrace();
    				}
    			}
    	    }
    	}
     
    	protected abstract void cleanData(Connection connection) throws SQLException;
    Une classe fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class  CableFilleTests extends BatchTest{
     
    	public CableFilleTests () {
    		super("", "");
    	}
     
    	protected void cleanData(Connection connection) throws SQLException {
    	}
     
    	@Test
    	public void cas1() {
     
    	}
     
    	@Test
    	public void cas2() {
     
    	}

    Mon souci est que le constructeur est lancé à chaque test par Junit, provocant un chargement de la base à chaque fois(qui plante évidemment) comment je fais pour lui faire comprendre que je ne veux pas ?!

    merci d'avance.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 350
    Points : 794
    Points
    794
    Par défaut
    Bonjour,

    Tu utilises l’annotation @AfterClass sur ta méthode clean().

    Ne pourrais-tu pas utiliser une technique similaire pour le chargement avec l’annotation @BeforeClass sur la méthode loadData(), qui sera appelle une seule fois pour tous les tests.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Le @AfterClass est une erreur, il faudrait que je puisse rendre les méthodes static ce que je ne peux faire à cause de la méthode abstraite.

    Mon problème de chargement est résolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public abstract class BatchTest {
     
    	private static Connection connection = null;
    	private static boolean isLoaded = false;
    	protected static String configFile = null;
     
    	public BatchTest(String configFile, String dataFile){
    		BatchTest.configFile = configFile;
    		if(!isLoaded()) {
    			try{
    				loadData(configFile, dataFile);
    			}catch (Exception e) {
    				e.printStackTrace();
    			}
    			setLoaded(true);
    		}
    	}
    }
    Maintenant c'est effacer les données qui pose problème.

    Une autre solution serait d'externaliser les chargements/déchargements de Bdd en dehors du Junit (enchaînement de tâche ant).

Discussions similaires

  1. Appel d'une méthode sur une classe avec héritage
    Par SasakiKojiro dans le forum Général Java
    Réponses: 13
    Dernier message: 17/04/2015, 18h56
  2. Héritage: comment appeler le constructeur parent ?
    Par scheme dans le forum Langage
    Réponses: 22
    Dernier message: 24/02/2011, 17h55
  3. Héritage et appel des constructeurs parents
    Par Antoine_935 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/05/2009, 18h03
  4. Réponses: 4
    Dernier message: 03/07/2006, 22h52
  5. [héritage privé] appel du constructeur de base
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2004, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo