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:
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
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.
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.