web-dev-qa-db-fra.com

Comparaison des dates avec les tests JUnit

Bonjour, je suis nouveau sur le site et j'ai un problème avec mon application en utilisant les tests JUnit. Mon problème est que lorsque j'essaie de comparer la méthode Date avec elle-même, elle échoue toujours. J'ai imprimé l'objet Date dans le test pour voir le problème et je me retrouve toujours avec le nom du package et des lettres aléatoires. Voici le constructeur Date:

public class Date
{
SimpleDateFormat dformat = new SimpleDateFormat("dd-MM-yyyy");

private int day;
private int month;
private int year;

public Date() 
{
    String today;
    Calendar present = Calendar.getInstance();

    day = present.get(Calendar.DAY_OF_MONTH);
    month = present.get(Calendar.MONTH);
    year = present.get(Calendar.YEAR);

    present.setLenient(false);
    present.set(year, month - 1, day, 0, 0);

    today = dformat.format(present.getTime());
    System.out.println(today);
}

Voici mon test:

@Test 
public void currentDay()
{
    Date current = new Date();
    System.out.println(current);
    assertEquals("today:", current, new Date());
}

Pourtant, le résultat échoue toujours et j'obtiens quelque chose comme:

comp.work.wk.Date@d3ade7

Toute aide serait appréciée.

16
user3276602

L'objet égal par défaut compare les emplacements de mémoire. Si les deux objets pointent vers le même emplacement mémoire, alors seulement ils s'imprimeront égaux, ce qui n'est pas le cas dans votre programme. comme ils pointent vers deux emplacements de mémoire différents, il donne toujours false, ce qui est attendu.

Si vous pensez que votre méthode assertEquals (date1, date2) doit renvoyer true car le contenu est égal, vous devez remplacer la méthode equals. Et chaque fois que vous remplacez égal, vous devez également remplacer la méthode hashcode () pour vous assurer que vous pouvez utiliser en toute confiance votre instance de classe comme clé dans toute collection basée sur le hachage comme HashMap ou HashSet.

Voici un lien expliquant comment remplacer la méthode equals () et hashcode ()

http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-Java.html

Et ne nommez pas votre classe comme n'importe quelle classe d'API comme l'a suggéré Jon Skeet.

J'espère que cela t'aides.

5
Srikanth Ganji

Il n'est pas nécessaire de remplacer la méthode égal par défaut. Vous utilisez simplement Date.compareTo () pour comparer deux objets de date.

12
Karthik Kota

Bien que la réponse de @Shrikanth le résout, ce problème se pose également avec les objets Date normaux. Deux solutions possibles sont données ici :

  1. Utilisez DateUtils.truncate (ou même DateUtils.truncatedEquals) pour comparer les dates. C'est quelque chose que vous pouvez utiliser dans votre méthode equals, ou pour des objets Date normaux directement dans assertEquals/assertTrue.

    assertEquals(DateUtils.truncate(date1,Calendar.SECOND), 
                 DateUtils.truncate(date2,Calendar.SECOND));
    
  2. Ne vérifiez pas si les dates sont les mêmes, mais si elles sont suffisamment proches les unes des autres (pour le test JUnit):

    assertTrue("Dates aren't close enough to each other!", 
               Math.abs(date2.getTime() - date1.getTime()) < 1000);
    
7
Hans Wouters

Mise à jour Le projet Joda-Time est maintenant en mode maintenance, l'équipe recommandant la migration vers les classes Java.time.


Ce type de travail est beaucoup plus facile avec la bibliothèque Joda-Time au lieu des classes de date/calendrier notoirement gênantes.

Exemple de code dans Joda-Time 2.3

Configurer des données…

DateTime now = new DateTime();
DateTime yesterday = now.minusDays( 1 );
DateTime nowAgain = new DateTime( now.toString() ); // New object, but same value inside.

Comparer…

boolean isNowEqualToYesterday = now.equals( yesterday );
boolean isNowEqualToNowAgain = now.equals( nowAgain );

Dump sur console…

System.out.println( "now: " + now );
System.out.println( "yesterday: " + yesterday );
System.out.println( "nowAgain: " + nowAgain );

System.out.println( "isNowEqualToYesterday: " + isNowEqualToYesterday );
System.out.println( "isNowEqualToNowAgain: " + isNowEqualToNowAgain );

Lors de l'exécution ...

now: 2014-02-06T01:31:43.157-08:00
yesterday: 2014-02-05T01:31:43.157-08:00
nowAgain: 2014-02-06T01:31:43.157-08:00
isNowEqualToYesterday: false
isNowEqualToNowAgain: true

Convertir

Vous pouvez convertir dans et hors de Joda-Time si nécessaire.

org.joda.time.DateTime dateTime = new DateTime( date ); // From Date to DateTime.
Java.util.Date date = dateTime.toDate();  // From DateTime to Date.
1
Basil Bourque

Vous devez remplacer à la fois equals () et toString (). Si vous remplacez égal, remplacez toujours hashcode () pour que vos cartes fonctionnent correctement.

0
Thom