2010-08-28 8 views
5

Je souhaite tester certaines méthodes de classe qui contiennent une logique dépendant de l'heure actuelle. Je voudrais définir l'heure de thread/jvm/system à une date future spécifique dans la configuration JUnit et exécuter mes tests. Aussi, j'aimerais que ce soit temporaire. Est-ce que quelqu'un a déjà fait ça?Est-il possible de changer l'heure actuelle d'un thread ou d'une instance jvm dans java?

Je pensais à quelque chose de similaire à TimeZone.setDefault (fuseau horaire)

+0

Les threads n'ont pas d'heure actuelle, pas plus que les JVM. – EJP

Répondre

2

Je ne crois pas qu'il y ait une façon de le faire en utilisant java.util.Date.

Si vous utilisez joda-time, vous pouvez. Voir this

+0

Joda temps semblait être la solution la plus simple pour moi – Kirby

2

J'ai lutté avec cela aussi. La meilleure solution que j'ai trouvée jusqu'ici est d'avoir une classe TimeHelper qui gère les choses du temps: en tant que fabrique de date, en gardant DateFormatters et ainsi de suite pour que ces choses ne soient pas distribuées sur la base de code.

Avec Easymock, ou un autre cadre simulé, il est alors facile de tester des choses liées au temps.

0

Vous vous y trompez. Vos méthodes de classe doivent accepter une valeur long qui représente le temps - ils ne doivent pas accepter un TimeZone. Si vous réfutez vos méthodes pour qu'elles soient découplées du fait qu'elles reçoivent le 'temps' d'un TimeZone, alors vous pouvez facilement tester vos méthodes sans avoir à faire ce que vous essayez de faire maintenant; vous appelez simplement vos méthodes avec des valeurs prédéfinies long représentatives d'une heure particulière, plutôt que de les appeler avec un objet TimeZone dont la valeur par défaut est quelque chose de prédéterminé que vous souhaitez tester.

Vous devez découpler les méthodes qui reçoivent un paramètre 'time' de la source qui fournit cette valeur de temps. En faisant cela, vous pouvez exécuter votre code en utilisant TimeZone ou l'heure actuelle du système, et vous pouvez tester votre code tout en utilisant des valeurs de temps prédéfinies que vous souhaitez tester.

Allez-y et essayez de refactoriser votre code et voyez si vous pouvez atteindre les capacités désirées - vous devriez être capable de. Revenez avec d'autres questions et nous serons heureux de vous aider!

Bonne chance.

4

Vous pouvez utiliser les méthodes AspectJ et wrap autour de java.lang.System.currentTimeMillis(), java.util.Date.new() et java.util.Calendar.getInstance() qui ajustent l'heure en fonction de vos besoins.

+0

+1 Je dois essayer cela un certain temps. –