2010-09-30 6 views
2

J'essaie d'écrire des tests unitaires pour mes contrôleurs dans une application Web Spring MVC. J'ai déjà eu un ensemble assez complet de tests unitaires pour le modèle de domaine, mais pour être complet, je veux aussi tester les contrôleurs.Unités contrôlant les contrôleurs avec des annotations

Le problème auquel je fais face est de tenter de les tester sans charger un contexte Spring. J'ai pensé que je pourrais contourner ceci avec moqueur, mais la méthode dans le contrôleur a une annotation @Transactional qui essaye d'ouvrir une transaction (et échoue avec une exception NullPointerException parce qu'aucun contexte de ressort n'est chargé).

Exemple de code:

public class UsersController { 

    @Autowired private UserManager userManager; 

    @Transactional 
    @RequestMapping(method = RequestMethod.POST) 
    public ModelAndView create(User user) { 

    userManager.save(user); 

    ModalAndView mav = new ModelAndView();  
    mav.addObject("user", user); 
    mav.setViewName("users/view"); 
    return mav; 
    } 

} 

donc essentiellement je veux tester le comportement sans charger un contexte et persistant en fait l'utilisateur.

Est-ce que quelqu'un a des idées sur la façon dont je peux y parvenir?

Cheers,

Caps

+2

Peut-être que vous avez spécifié le coureur de test de printemps sur votre test? Sinon, @Transactional ne doit pas provoquer l'échec du test. – oksayt

+1

Vous avez raison. Merci pour ça! N'hésitez pas à mettre cela comme réponse et je vais le corriger. – Caps

Répondre

3

je dirais moqueur est le chemin à parcourir ici. L'annotation @Transactional n'aura d'effet que si un contexte Spring est chargé et chargé de configurer les transactions basées sur des annotations.

Assurez-vous que vous n'êtes pas instruisant JUnit pour exécuter votre test dans un contexte de printemps en spécifiant quelque chose comme:

@ContextConfiguration(locations = "classpath:spring/ITestAssembly.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 

Pour éviter toute confusion, je continue mes tests unitaires (pas en cours d'exécution dans un ressort contexte) dans des fichiers séparés que mes tests d'intégration. Typiquement, tous les simulacres se produisent dans les tests unitaires et non dans les tests d'intégration.

+0

Oui, j'ai sorti le contexte de printemps et se moquait du UserManager et tout va bien. – Caps

1

Le NullPointerException se produit non pas à cause du Transactional, mais parce que rien ne se fait injecter comme UserManager. Vous avez deux options:

  • course avec le coureur de test ressort
  • maquette du userManager et le mettre.
+0

Merci pour votre aide, je suis allé avec la deuxième option. – Caps

Questions connexes