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 :

Singleton (Pas de constructeur publique)


Sujet :

Tests et Performance Java

  1. #1
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut Singleton (Pas de constructeur publique)
    Bonjour,
    En passant de JUnit 3 à la version 4, j'ai un pb pour exécuter les tests sur les classes "Singleton".
    Quand je lance les tests sur la classe suivante j'ai droit à une erreur :
    java.lang.Exception: Test class should have exactly one public constructor

    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
     
    public class FileComparator
    {
    	// Singleton instance
    	protected static FileComparator instance = null;
     
    	private static FileComparator getInstance() throws NoSuchAlgorithmException
    	{
    		if(instance==null)
    			instance = new FileComparator();
    		return instance;
    	}
     
    	public static String calculateChecksum(File file) throws IOException, NoSuchAlgorithmException
    	{
    		return getInstance().compute(file);
    	}
     
    	public static String getEncoding() throws NoSuchAlgorithmException
    	{
    		return getInstance().getChecksum().getEncoding();
    	}
     
    	public static String getMethod() throws NoSuchAlgorithmException
    	{
    		return getInstance().getChecksum().getName();
    	}
     
    	// File comparator logic
    	protected AbstractChecksum checksum;
     
    	private FileComparator() throws NoSuchAlgorithmException
    	{
    		// TODO set theses values from configuration settings
    		String method = "md5";
    		String encoding = AbstractChecksum.HEX;
     
    		// Initialize the checksum
    		try
    		{
    			checksum = JacksumAPI.getChecksumInstance(method);
    			checksum.setEncoding(encoding);
    		} 
    		catch (NoSuchAlgorithmException e)
    		{
    			logger.error("Unable to initialize the file comparator tool", e);
    			throw e;
    		}
    	}
     
    	private AbstractChecksum getChecksum()
    	{
    		return checksum;
    	}
     
    	private String compute(File file) throws IOException
    	{
    		getChecksum().reset();
    		getChecksum().readFile(file.getAbsolutePath());
    		return getChecksum().format("#CHECKSUM");
    	}
     
    	@Test
    	public void test()
    	{
    		File file_1 = null;
    		File file_2 = null;
    		try
    		{
    			file_1 = File.createTempFile("ads_test"/*prefix*/, ".txt"/*suffix*/);
     
    			file_2 = File.createTempFile("ads_test"/*prefix*/, ".txt"/*suffix*/);
     
    			// Input data the files
    			String fileContent = "blabla &$& ";
    			try {
    				BufferedWriter out = new BufferedWriter(new FileWriter(file_1));
    				out.write(fileContent);
    				out.close();
     
    				out = new BufferedWriter(new FileWriter(file_2));
    				out.write(fileContent);
    				out.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    				Assert.fail("Unable to init file data");
    			}
     
    			Assert.assertTrue(FileComparator.calculateChecksum(file_1).equals(FileComparator.calculateChecksum(file_2)));
    			Assert.assertTrue(file_1.length()==file_2.length());
     
    			try {
    				BufferedWriter out = new BufferedWriter(new FileWriter(file_2, true));
    				out.write(fileContent);
    				out.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    				Assert.fail("Unable to init file data");
    			}
     
    			Assert.assertFalse(FileComparator.calculateChecksum(file_1).equals(FileComparator.calculateChecksum(file_2)));
    			Assert.assertFalse(file_1.length()==file_2.length());
     
    		} 
    		catch(Exception ex )
    		{
    			ex.printStackTrace();
    			Assert.fail("Exception during JUnit run.");
    		}
    		finally
    		{
    			if(file_1!=null)
    				file_1.deleteOnExit();
    			if(file_2!=null)
    				file_2.deleteOnExit();
    		}
    	}
    }
    Je comprend l'erreur mais je n'arrive pas à trouver de solution pour réaliser mes tests... Je ne trouve rien sur google mais j'imagine que je ne dois pas être le premier à avoir ce genre de pb...

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,

    Est ce que tu es obligé de combiner la classe à tester et le test en une seule classe ?

    Il suffirait de séparer les 2 pour résoudre ce problème, non ?

  3. #3
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Effectivement oui.

    Mais je suis en train de découvrir JUnit 4 et j'ai cru comprendre qu'il était plus "simple" de faire comme cela (c'est vrai que ça permet de ne pas avoir des classes "XXXTest" et de ne plus avoir à chercher ou et qd une classe est testée)

    Voilà, c'était pour avoir l'avis de personnes plus expérimentées, mais sinon je vais revenir à l'ancienne méthode.

    Merci

  4. #4
    Membre actif
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Points : 251
    Points
    251
    Par défaut classe Testée et Test ensemble
    Salut Manube,

    Ce n'est pas forcément plus simple de mettre les deux ensembles : il faut scroller pour voir s'il y a un test.

    Quelque soit la version de JUnit, les classes testées et de test sont séparées. Pour Toto, la classe de test s'appelera TotoTest et sera dans le meme package (avec juste un source folder different). Donc un CTRL+SHIFT+T dans Eclipse permet de savoir si une classe est testée, ou non.

    C'est assez inhabituel de tout mettre ensemble (perso j'avais jamais vu) donc c'est peut etre pour ça que tu n'as rien trouvé sur google.

    ++
    Foucha.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

  5. #5
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Merci pour ton aide,

    J'ai trouvé bcp de doc technique pour Junit 4 mais pas trop de doc concernant la mise en pratique dans un projet, ce qui est au moins aussi important. Donc merci pour tes commentaires, je vais m'en servir pour mettre un peu d'ordre dans mes classes de test.

  6. #6
    Membre actif
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Points : 251
    Points
    251
    Par défaut intro aux tests unitaires
    j'avais fait un peu le meme constat que toi : faire des tests unitaires ok, on veut bien, mais comment?

    Y a un bouquin de Michael Feathers sur comment ajouter des tests unitaires sur du code existant : Working with legacy code, qui peut te servir.

    En attendant, j'ai fait une intro aux tests unitaires ici et Bruno Orsier un doc plus complet ici.

    Bonne lecture !
    Foucha.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

  7. #7
    Membre habitué Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Points : 178
    Points
    178
    Par défaut
    Merci pour les liens, je suis en train de mettre en pratique les différents conseils.

    Est ce que tu en aurais un lien concernant le test des classes "DAO"???
    C'est une partie qui n'est jamais traitée dans les tutorials que je trouve et je ne suis pas sur de suivre les bonnes méthodes.

    Merci

  8. #8
    Membre actif
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Points : 251
    Points
    251
    Par défaut test des dao
    Salut,

    Disons que ce n'est plus vraiment unitaire de tester des dao. Perso, j'utilise fitnesse pour ça, mais c'est un peu écraser une mouche avec un bazouka, ça prend du temps.

    Cela dit, tu peux tout de meme utiliser JUnit pour faire ton test fonctionnel :
    http://en.wikipedia.org/wiki/Behavio...en_Development

    Le probleme c'est que tes tests seront fortement liées au contenu de ta base, et si ce n'est pas une base dédiée de tests... eh bien tu vas passer un temps fou à mettre à jour tes tests. Pour etre peinard, il faudrait une base vide ou tu insere tes données au debut du test et ou tu les vides à la fin...

    ++
    Foucha.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

Discussions similaires

  1. [Débutant] Impossible de sérialiser => Pas de constructeur sans paramètres
    Par Granopla dans le forum VB.NET
    Réponses: 4
    Dernier message: 26/01/2014, 15h19
  2. Réponses: 2
    Dernier message: 29/12/2011, 08h45
  3. singleton pas tres clair
    Par horkets dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 30/07/2009, 22h01
  4. pas de constructeur dans une classe
    Par womannosky dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2008, 10h16
  5. [Language][DAO]Pourquoi pas des Singletons ?
    Par le Daoud dans le forum Langage
    Réponses: 11
    Dernier message: 04/05/2005, 09h16

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