2009-10-09 12 views
3

Je souhaite tester un contrôleur Grails qui appelle un service. Je voudrais me moquer du service. Le service a une méthode:Aide au test de l'unité Grails requise

JobIF JobServiceIF.getJob(int)

et JobIF a une méthode:

String JobIF.getTitle()

Voici mon contrôleur

 
def workActivities = { 
    JobIF job = jobService.getJob(params.id) 
    [career:job] 
} 

Je comprends que je dois moquer le service et la classe d'emplois (il y a des implémentations concrètes pour les deux) mais je me bats pour avoir la tête autour du Groovy Mock syntaxe d'objet. Comment puis-je me moquer d'un travail et définir le titre à quelque chose, dire "Architecte", puis tester le code?

Jusqu'à présent je:

 
void testWorkActivities() { 
    def controller = new CareersController() 
    ... // Mocking stuff I don't know how to do 
    controller.params.id = 12 
    def model = controller.workActivities() 
    assertEquals "Architect", model["career"].getTitle() 
} 

Répondre

6

Vous avez deux choix

  1. Utilisez les classes se moquant Groovy, à savoir MockFor et StubFor
  2. Utilisez les Grails classes simulées en appelant la méthode mockFor de GrailsUnitTestCase. La classe retournée par cette méthode est une instance de GrailsMock

Personnellement, j'ai trouvé les objets fantaisie Groovy à un peu plus fiable que le Grails se moque. Parfois, j'ai découvert que mes objets de simulation de Grails étaient contournés, même si je semblais tout mettre en place correctement.

Voici un exemple de la façon d'utiliser le Groovy se moque:

void testCreateSuccess() { 

    def controller = new CareersController() 

    // Create a mock for the JobService implementation class 
    def mockJobServiceFactory = new MockFor(JobService) 

    mockJobServiceFactory.demand.getJob {def id -> 
     // Return the instance of JobIF that is used when the mock is invoked 
     return new Job(title: "architect") 
    } 

    // Set the controller to use the mock service 
    controller.jobService = mockJobServiceFactory.proxyInstance() 

    // Do the test 
    controller.params.id = 12 
    def model = controller.workActivities() 
    assertEquals "Architect", model["career"].getTitle() 
} 

Le processus est essentiellement le même lors de l'utilisation du Grails des Mock, mais vous appelez la méthode mockFor de la classe de test, au lieu de l'instanciation MockFor.

+0

Merci. Puis-je poser une autre question? Si le JobService a un argument constructeur, comment le spécifier? Par exemple, JobService prend un JobDao comme argument de constructeur. Merci. – Matt

+0

Le stacktrace par la voie est: Testcase: testWorkActivities a pris 0,344 sec \t a provoqué une erreur Impossible de trouver le quelle méthode () pour appeler de cette liste: publique uk.co.cascaid.biz.job.JobObservableCachedService # (uk.co.cascaid.dao.job.JobDaoIF, uk.co.cascaid.biz.common.paging.PageCollectionServiceIF) public uk.co.cascaid.biz.job.JobObservableCachineService # (fr.caça.caid. dao.job.JobDaoIF) org.codehaus.groovy.runtime.metaclass.MethodSelectionException: – Matt