2010-04-22 11 views
3

J'ai récemment été présenté à EasyMock et on m'a demandé de développer des tests unitaires pour une classe FileMonitor qui l'utilise. La classe FileMonitor est basée sur un événement temporisé qui se réveille et vérifie les modifications de fichiers dans une liste définie de fichiers et de répertoires. Je comprends comment faire cela en utilisant le système de fichiers actuel, écrire un test qui écrit dans un fichier et laisser le FileMonitor faire son truc. Alors, comment faire cela en utilisant EasyMock? Je ne comprends pas comment EasyMock se moque du système de fichiers.Comment copier un fichier avec EasyMock?

Merci, Todd

Répondre

5

Quelque chose le long des lignes de:

import static org.easymock.classextension.EasyMock.*; 

File testDir = createMock(File.class); 
expect(testDir.lastModified()).andReturn(10L); 
// more expectations 
replay(testDir); 
// create a FileMonitor watching testDir 
// run the method which gets invoked by the trigger  
verify(testDir); 
+0

Cela ressemble à ce que je cherche. Je dois jouer avec ça un peu avant de commenter davantage. Merci pour l'excellente direction. – Todd

+0

Il semble que je devrais faire une sorte d'interface pour le fichier, car EasyMock nécessite un type d'interface pour se moquer d'une classe. Je vais vous laisser savoir comment ça se passe. – Todd

+0

D'accord, de retour là où j'étais.Puisque je me moque seulement d'une interface, comment "écrire" à l'objet mocké, qui n'est plus de type Fichier, mais du type de l'interface? – Todd

0

La technique de base pour moqueur est d'introduire une interface (si la conception actuelle ne dispose pas d'un) qui fournit des méthodes pour le service réel (la dépendance) qui est moqué. Le test teste que la classe sous test interagit correctement avec la dépendance. Correctement signifie ici qu'il fait ce que vous attendez de lui. Cela ne veut pas dire qu'il fait la bonne chose, car la bonne chose ne peut être déterminée que par un test d'intégration qui utilise les composants réels (ce que vous envisagez de faire en créant un vrai fichier).

Vous avez donc besoin d'une méthode sur la classe testée qui vous permette de transmettre une implémentation de cette interface. Le plus évident est via le constructeur. Vous avez le constructeur de production qui initialise la classe avec l'implémentation réelle de l'interface qui frappe le système de fichiers réel, puis en test, vous passez dans le simulacre au constructeur.

Dans le test, vous exécutez les méthodes sur la classe et affirment que l'interface a été appelée comme vous le souhaitez. Je noterai que le fait de venir après la création d'une classe et que les tests unitaires par mock ont ​​une valeur limitée, mais cela aidera à verrouiller le comportement de sorte que les futurs changements dans la classe ne briseront pas les attentes de façon surprenante.

J'espère que cela vous aidera à démarrer.

Certains frameworks moqueurs prennent en charge des classes de béton réelles moqueuses, ce qui peut avoir beaucoup de sens dans les tests unitaires test-after (en interceptant les appels aux classes réelles et pas seulement les interfaces). Je ne pouvais pas trouver si EasyMock vous permet de faire cela, mais JDave est probablement l'endroit où aller si vous avez besoin de ce genre de fonctionnalité. Il vous permet même de vous moquer des classes finales.

2

Jetez un oeil à l'excellent (et concis) manual. Cependant, vous pouvez reconsidérer en utilisant EasyMock - la plupart des gens utilisent actuellement ou sont en train de passer au Mockito plus avancé et plus activement développé (inspiré par EasyMock).

+0

Merci pour le conseil. Malheureusement, je n'ai pas le choix, c'est ce que l'entreprise a choisi. En ce qui concerne le manuel, je l'ai lu avant de poser la question, je suppose que j'ai raté la partie sur les systèmes de fichiers. – Todd

0

Je mettrais l'appel réel au système de fichiers dans sa méthode package-private séparée. Pour tester, étendez la classe et remplacez cette méthode. Ainsi, vous ne lancez pas d'appel au système de fichiers.

EasyMocks classextension a aussi la possibilité de créer des mocks paritaires, mais je n'en suis pas totalement convaincu.

http://easymock.org/EasyMock2_4_ClassExtension_Documentation.html