2010-09-13 15 views
0

Je voudrais mocker une implémentation de la vue de MVC design pattern. J'ai implémenté le MVP (une autre variation MVC), et je voudrais tester si les certaines méthodes dans la vue sont appelées correctement par le contrôleur quand un changement d'état se produit sur le modèle. Voici la séquence des appels de méthode sur les model, controller et view.Comment se moquer de la vue dans le test d'intégration MVC en utilisant JUnit et EasyMock

Modèle:

 
model.setProperty("newProperty"); 

Controller:

 
@Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     for (View view : views) { 
      view.modelPropertyChange(evt); 
     } 
    } 

Vue: Ce résultat à la vue d'être appelé comme:

 
@Override 
    public void modelPropertyChange(PropertyChangeEvent evt) { 
     if ("Property".equals(evt.getPropertyName())) { 
      updateView(); 
     } 
    } 

Question: Comment vérifier (en utilisant EasyMock dans le test JUnit), l'ordre attendu de la méthode (avec argument (s) valide (s)) exécution? Je m'attends à view.modelPropertyChange(evt) pour être appelé et attendre view.isViewUpdated() pour retourner true sur l'objet view. Comment puis-je dire cela dans mon test JUnit? S'il vous plaît aider!

Répondre

2
@RunWith(JUnit4.class) 
public class ControllerTest { 
    @Test 
    public void updateView() { 
    PropertyChangeEvent evt = new PropertyChangeEvent(...); 
    View mockView = EasyMock.createMock(View.class); 
    mockView.modelPropertyChange(evt); 
    EasyMock.replay(mockView); 

    Controller controller = new Controller(...); 
    controller.propertyChange(mockView); 
    EasyMock.verify(mockView); 
    } 
} 

Notez que le Controller.propertyChange() ne remet pas View.isViewUpdated() donc il n'y a pas besoin de se moquer isViewUpdated. Vous devez tester isViewUpdated dans un test pour la classe View.

Si propertyChange a fait appel isViewUpdated alors vous ajoutez l'appel suivant avant EasyMock.replay():

EasyMock.expect(mockView.isViewUpdated()).andReturn(true); 

Notez que EasyMock.createMock() ne force pas les appeler les méthodes chinés dans l'ordre où ils ont été moquaient. Si vous voulez que l'ordre de méthode soit appliqué, utilisez EasyMock.createStrictMock()

+0

Je reçois une erreur lorsque j'exécute EasyMock.verify (mockView): "Erreur d'attente lors de la vérification ..." – walters

+0

Habituellement, vous pouvez dire à partir de la trace de la pile quel est le problème est. Le code ci-dessus indique à EasyMock de s'attendre à ce que "modelPropertyChange" soit appelé sur la vue avec un événement égal à "evt". Si vous obtenez une exception dans EasyMock.verify() qui indique généralement que la méthode n'a pas été appelée. – NamshubWriter