2010-11-05 20 views
2

Je suis nouveau sur Spring MVC et je suis en train d'apprendre à tester mes contrôleurs. J'ai un test simple:Accéder aux attributs d'un modèle contenu dans un objet ModelAndView à partir du contexte d'un test de contrôleur

@Test 
public void shouldDoStuff() 
{ 
    request.setRequestURI("/myCompany/123"); 
    ModelAndView mav = controller.getSomeDatas("123", request); 
    assertEquals(mav.getViewName(), "company"); 
    assertTrue(mav.getModel().containsKey("companyInfo")); 
    assertTrue(mav.getModel().containsKey("rightNow")); 
    assertEquals(mav.getModel().get("companyInfo"), "123"); 
} 

Voici mon action du contrôleur:

@RequestMapping(value = "/myCompany/{companyGuid}", method = RequestMethod.GET) 
public ModelAndView getSomeDatas(@PathVariable("companyGuid") String myGuid, HttpServletRequest request) 
{ 
    /*ModelAndView mav = new ModelAndView("company"); 
    mav.addObject("companyInfo", myGuid); 
    mav.addObject("rightNow", (new Date()).toString()); 
    return mav;*/ 
    Map<String, Object> myModel = new HashMap<String, Object>(); 

    myModel.put("companyInfo", myGuid); 
    myModel.put("rightNow", (new Date()).toString()); 

    return new ModelAndView("company", "model", myModel); 
} 

J'ai un point d'arrêt défini sur la première assert. Dans le retourne exactement ce que j'attends fenêtre d'affichage dans Eclipse, mav.getModel():

mav.getModel() 
(org.springframework.ui.ModelMap) {model={rightNow=Fri Nov 05 13:30:57 CDT 2010, companyInfo=123}} 

Cependant, toute tentative d'accéder aux valeurs dans ce modèle échoue. Par exemple, je suppose ce qui suit fonctionnerait:

mav.getModel().get("companyInfo") 
null 
mav.getModel().containsKey("companyInfo") 
(boolean) false 

Mais comme vous pouvez le voir, obtenir ("CompanyInfo") renvoie null, et containsKey ("CompanyInfo") retourne false. Lorsque j'échange la section commentée du contrôleur avec la section décommentée, mes tests fonctionnent correctement, mais ma vue jsp s'arrête, car j'essaie d'accéder aux propriétés du modèle en disant des choses comme $ {modèle .companyInfo}, etc.

donc je dois savoir au moins une des deux choses (mais mieux si vous pouvez répondre à la fois):

  1. Si je quitte le contrôleur comme le montre, comment puis-je accéder à la attributs du modèle dans mon test?
  2. Si j'échange la section commentée de la section non commentée, comment puis-je accéder aux attributs du modèle dans ma vue jsp?

Toute aide est appréciée.

+0

Eh bien la réponse évidente est que votre contrôleur est cassé, et le test fait son travail. Sans voir votre code de contrôleur, c'est tout ce que je peux suggérer, – skaffman

+0

J'ai mis à jour ma question pour inclure mon code de contrôleur. D'une manière ou d'une autre, le fait que l'objet contienne clairement la valeur que je recherche semble plutôt contradictoire avec le fait que je ne peux pas récupérer cette valeur, n'est-ce pas? – Samo

Répondre

1

@pedrofalcaocosta, je Je donnerais votre réponse à un vote positif parce qu'il m'a aidé à trouver ma réponse, mais je pense qu'il est approprié de répondre à ma propre question ici:

((java.util.HashMap<String,Object>)mav.getModel().get("model")).get("companyInfo") 
+0

Désolé pour la réponse incomplète, mais la mise à jour de votre question me fait un peu confuse ... Je savais que le problème était dans le nom du «modèle». En tout cas ... vous êtes les bienvenus! – pedrofalcaocosta

1

Vous avez oublié d'appeler le constructeur de ModelAndView avec le nom de vue, et vous avez oublié d'ajouter vos objets au modèle.

Je pense que vous devriez regarder le code quelque chose comme ça ...

@Test 
public void shouldDoStuff() 
{ 
    request.setRequestURI("/myCompany/123"); 
    // call the constructor with the name of your view   
    ModelAndView mav = new ModelAndView("viewName"); 
    // add the objects to the model   
    mav.addAllObjects(controller.getSomeDatas("123", request)); 
    assertEquals(mav.getViewName(), "viewName"); 
    assertTrue(mav.getModel().containsKey("companyInfo")); 
} 

Si vous avez besoin d'ajouter plus d'un objet avec les touches personnalisées utilisent la méthode addObject à la place;

mav.addObject("key1", 1); 
    mav.addObject("key2", 2); 
+0

Je peux voir pourquoi cela fonctionnerait, mais ce que je ne comprends pas c'est: getSomeDatas() est supposé retourner un objet ModelAndView. L'objet qu'il renvoie contient clairement les valeurs que j'ai ajoutées à celui-ci, comme indiqué ci-dessus. Pourquoi ne puis-je pas récupérer ces valeurs? Pourquoi devrais-je créer un nouvel objet ModelAndView dans mon test et ajouter des objets à partir du contrôleur, quand mon contrôleur est censé RETOURNER cet objet ModelAndView avec les valeurs contenues dans? – Samo

6

Ok, maintenant c'est clair!

Essayez:

mav.getModel().get("model"); 
mav.getModel().containsKey("model"); 

Vous avez appelé votre modelmap 'modèle' dans votre contrôleur ...

Dans votre jsp je vous conseille d'utiliser jstl:

<%@page contentType="text/html; charset=utf-8" pageEncoding="UTF-8" language="java"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <body> 
    ${model.companyInfo} 
    </body> 
</html> 
+0

merci pour le conseil, c'était utile, mais pas tout à fait là :) Il m'a aidé à trouver la réponse, mais j'ai posté la réponse réelle dans l'espoir que cela aidera d'autres développeurs rencontrant le même problème. – Samo

5

Pour la question 1, Model fournit une méthode qui renvoie les attributs du modèle sous la forme d'une carte.Dans votre test, vous pouvez faire:

Map<String,Object> modelMap = mav.getModel().asMap(); 
modelMap.get("companyInfo"); 

En supposant que vous définissez companyInfo dans le modèle, il devrait être là. En ce qui concerne la partie 2 de la question, je pense que quelqu'un d'autre a déjà répondu à cette question.