2012-02-20 5 views
5

dostałem w zwyczaju robić to tak, że w moich testów jednostkowych mogę sprawdzić, co zostało dodane do modeluJaka jest różnica między tworzenia nowego ModelAndView lub przechodząc w modelu jako metoda parametru

@RequestMapping(value = "/Foo", method = RequestMethod.GET) 
public ModelAndView goHome() 
{ 
    ModelandView mav = new ModelAndView("foobar.jsp"); 
    mav.addObject("bar", new Bar()); 
    return mav; 
} 

Czy to lepiej:

@RequestMapping(value = "/Foo", method = RequestMethod.GET) 
public String goHome(final Model model) 
{ 
    model.addAttribute("bar", new Bar()); 
    return "foobar.jsp"; 
} 

Odpowiedz

6

różnica jest tylko semantyczny. Jeśli nie utworzysz obiektu ModelAndView Spring zrobi to za Ciebie.

Ogólnie rzecz biorąc, preferowane jest drugie podejście, ponieważ test jednostki jest o wiele łatwiejszy, zwłaszcza jeśli zamiast modelu zostanie przekazany model Map.


EDIT wyjaśnienie na testów (na jUnit). Uważam następujący podpis preferowanej:

@RequestMapping(value = "/Foo", method = RequestMethod.GET) 
public String goHome(final Map model) { 
    model.addAttribute("bar", new Bar()); 
    return "foobar.jsp"; 
} 

To pozwala nam stworzyć test, nie wiedząc nawet Spring jest zaangażowany

@Test 
public void testGoHome() { 
    // Setup 
    Controller controller = ... 
    Map<String, Bar> model = new HashMap<String, Bar>(); 

    // Test 
    assertEquals("foobar.jsp", controller.goHome(model)); 
    assertNotNull(model.get("bar")); 
} 

Ten przykład jest oparty na Map, ale może być również ModelMap lub nawet Model jeśli wolisz.

+0

Pamiętam, że zrobiłem to, ponieważ łatwiej było testować jednostki, gdy zwrócisz modelandview, jak inaczej przetestujesz to, co zostało dodane do modelu, jeśli zwrócisz łańcuch? – NimChimpsky

+0

@NimChimpsky można zrobić fałszywy obiekt modelu i przekazać go do metody – masted

+0

@NimChimksky, 'Spring' próbuje być * nieinwazyjny *. Np. Używasz zwykłej metody bez sprężystości, opatrzonej adnotacjami adnotacjami typu "Wiosna" i nagle masz dostęp do sieci. –

Powiązane problemy