2009-07-17 25 views
1

Mon programme a une routine quotidienne, similaire à un événement de réveil. Dites, quand il est 14 heures (l'heure est l'heure du système dans mon PC), faites quelque chose pour moi. Ce que je veux faire est d'accélérer la période de test (je ne veux pas vraiment attendre 4 jours en regardant la routine quotidienne et vérifier les erreurs.) Je lis sur wiki of Mock object, l'écrivain DID mentionne le programme de réveil. J'étais si heureux de voir mais encore, je ne sais pas comment le faire. Je suis nouveau à Mock Object, et je programme en Java. Donc, JMock ou EasyMock (ou tout similaire) pourrait me convenir.Comment utiliser un objet fantaisie imitant un programme quotidien?

Merci

Répondre

4

Chaque fois que vous devez obtenir l'heure actuelle, ne pas utiliser l'horloge système directement - utilisez une interface telle que:

public interface Clock 
{ 
    long currentMillis(); 
} 

Vous pouvez ensuite mettre en œuvre ce avec une horloge de système pour la production, et passer en un faux pour les tests, où vous pouvez définir le faux à tout moment que vous voulez.

Cependant, vous devrez également simuler tout ce qui est en train de piloter votre système - attendez-vous explicitement un moment donné ou est-ce que quelque chose d'autre appelle votre code?

+0

Je pense que votre approche fonctionnera pour mon cas, cauz 'J'attends simplement un moment particulier pour un travail de routine. – Lily

1

Je dois présenter des excuses puisque vous avez posé des questions sur java et je suis sorti pour le déjeuner quand il s'agit de java, mais une solution est de raillent l'objet DateTime et le mettre à l'heure souhaitée .

Dans .NET, il ressemblerait à quelque chose comme ceci:

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

SystemTime.Now =() => new DateTime(2000,1,1); 

De: Dealing With Time In Tests


... [A] n programme d'horloge d'alarme qui provoque une cloche à sonner à un certain moment pourrait obtenir l'heure actuelle de l'extérieur monde. Pour tester cela, le test doit attendre jusqu'à l'heure de l'alarme pour savoir s'il a sonné la cloche correctement. Si un objet simulé est utilisé dans lieu de l'objet réel, il peut être programmé pour fournir la sonnerie sonnerie (que ce soit en fait cette heure ou non) de sorte que le programme de réveil peut être testé seul . Ce réveil que vous référez donne un exemple de se moquer d'un objet.

Ce n'est pas réellement un objet que vous pouvez utiliser dans le cadre fictif.

0

Fondamentalement, ce que vous faites dans le test est faux les événements d'horloge. Exactement comment dépend un peu de la conception, et comment vous attendez l'événement, mais pour rester simple (sinon pur) mon approche serait d'avoir une méthode qui est appelée lorsque l'événement de temps est déclenché, puis tester les deux côtés de ça.

La première consiste à tester l'appel de la méthode et à voir que l'événement minuté répond à vos attentes. Ensuite, simulez cette classe (avec JMock, la méthode préférée est d'en faire une interface et d'implémenter cette interface par votre méthode d'appel).

Vous passez ensuite le simulacre à la classe qui gère la synchronisation.Là encore, je ferais abstraction des problèmes de threading/déclenchement (tels que la vérification de l'horloge du système et le démarrage du thread) et avoir des valeurs de retour mock qui traitent essentiellement l'événement tout de suite.

Conservez ensuite le code réel qui lit réellement l'horloge du système et commence le thread aussi petit que possible, et ce sera la zone qui n'est pas sous test unitaire.

0

La simulation se rapporte aux tests unitaires. Pour la fonctionnalité que vous décrivez, je sépare le déclencheur (dans votre cas, l'événement du réveil) du processus (quel que soit le déroulement de votre routine quotidienne) et j'essaie de tester la fonctionnalité du processus. Ensuite, dirigez votre attention sur le code de planification qui invoquera la fonctionnalité de votre processus. Je recommande d'utiliser quelque chose comme Quartz pour cela, mais si vous allez rôle-votre-propre le test de l'unité pour cela peut fonctionner avec l'horloge système réelle à condition que vous affectez le temps de déclenchement en fonction de la valeur actuelle de l'horloge du système comme Tout ce que vous allez tester, c'est que l'événement déclencheur se produit.

+0

J'utilise Quartz ;-), et merci pour vos conseils. – Lily

+0

Cool, ça le rend simple :-) Il ne sert à rien de re-tester Quartz, il suffit de tester vos fonctionnalités comme je le suggère. –