2009-05-14 25 views
18

, belirli bir URL belirli bir yöntemle ele belirtmek edebilir ve belirli parametreler şöyle özellikle argümanları eşler belirtebilirsiniz:Test Bahar MVC açıklama mapppings Spring MVC ile

@Controller 
public class ImageController { 

    @RequestMapping("/getImage") 
    public String getImage(@RequestParam("imageId") int imageId, Map<String,Object> model) { 
     model.put("image",ImageService.getImage(imageId)); 
    } 

} 

Bu her şey iyi ve güzel, ama şimdi bir imageId parametresiyle bir http isteğinin bu yöntemi doğru şekilde çağırdığını test etmek istiyorum. Başka bir deyişle, ek açıklamaları kaldırır veya değiştirirseniz kırılacak bir test istiyorum. Bunu yapmanın bir yolu var mı?

Bu getImage'ın düzgün çalıştığını test etmek kolaydır. Sadece bir ImageController yaratabilirim ve uygun argümanlarla getImage'i çağırırdım. Ancak, bu testin sadece bir yarısıdır. Testin diğer yarısı, uygun bir HTTP isteği geldiğinde, Spring framework tarafından getImage() 'ın çalıştırılıp başlatılmayacağı olmalıdır. Bu bölüm için bir sınava ihtiyacım var gibi hissediyorum, özellikle de @RequestMapping ek açıklamalarım daha karmaşık hale geldiğinde parametre koşulları.

Satır 4, @RequestMapping("getImage")'u kaldırırsam kırılacak bir sınama gösterebilir misiniz?

+1

Sorunuzu tam olarak anlamadım. "Ek açıklama eşlemesi kullanan Spring MVC Denetleyicileri için Birim testi nasıl oluşturulur?" Demek istiyor musunuz? –

+0

Üzgünüm. Yani, açıklamanın doğru olduğunu test etmek istediğimi ve bir HTTP isteğinin bu yöntemi gerçekten işe yarayacağını kastediyorum. –

cevap

12

AnnotationMethodHandlerAdapter ve handle yöntemini programsal olarak kullanabilirsiniz. Bu, verilen istek için yöntemi çözecek ve uygulayacaktır. Ne yazık ki bu biraz dolaylı. Aslında, belirli bir istek için yöntemin çözümlenmesinden sorumlu olan, AMHA'da ServletHandlerMethodResolver isimli özel bir sınıf var. Bu konuda da bir request for improvement başvurdum, çünkü bunu da görmek istiyorum.

Bu arada, örn. Denetleyici sınıfınızın bir alayını oluşturmak için EasyMock, verilen yöntemin çağrılmasını ve bu alayı handle'a teslim etmesini bekleyin.

Denetleyici:

@Controller 
public class MyController { 

    @RequestMapping("/users") 
    public void foo(HttpServletResponse response) { 

    // your controller code 
    } 
} 

Testi:

public class RequestMappingTest { 

    private MockHttpServletRequest request; 
    private MockHttpServletResponse response; 
    private MyController controller; 
    private AnnotationMethodHandlerAdapter adapter; 


    @Before 
    public void setUp() { 

    controller = EasyMock.createNiceMock(MyController.class); 

    adapter = new AnnotationMethodHandlerAdapter(); 
    request = new MockHttpServletRequest(); 
    response = new MockHttpServletResponse(); 
    } 


    @Test 
    public void testname() throws Exception { 

    request.setRequestURI("/users"); 

    controller.foo(response); 
    EasyMock.expectLastCall().once(); 
    EasyMock.replay(controller); 

    adapter.handle(request, response, controller); 

    EasyMock.verify(controller); 
    } 
} 

Selamlar, Ollie

+0

Fazladan bir satır ekleyin: 'request.setAttribute (HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, Boolean.TRUE);' Denetleyici düzeyinde eşleme kullandığınızda gereklidir – takacsot

6

Ollie'nın çözümü nasıl test daha geniş soru hakkında spesifik bir açıklama örneği ama ne test kapakları diğer tüm çeşitli Bahar MVC ek açıklamaları. (Kolayca diğer ek açıklamaların kadar uzatılabilir) Benim yaklaşımım Ben de blog entry about integration testing Spring MVC annotations yazdım

import static org.springframework.test.web.ModelAndViewAssert.*; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({/* include live config here 
    e.g. "file:web/WEB-INF/application-context.xml", 
    "file:web/WEB-INF/dispatcher-servlet.xml" */}) 
public class MyControllerIntegrationTest { 

    @Inject 
    private ApplicationContext applicationContext; 

    private MockHttpServletRequest request; 
    private MockHttpServletResponse response; 
    private HandlerAdapter handlerAdapter; 
    private MyController controller; 

    @Before 
    public void setUp() { 
     request = new MockHttpServletRequest(); 
     response = new MockHttpServletResponse(); 
     handlerAdapter = applicationContext.getBean(HandlerAdapter.class); 
     // I could get the controller from the context here 
     controller = new MyController(); 
    } 

    @Test 
    public void testFoo() throws Exception { 
     request.setRequestURI("/users"); 
     final ModelAndView mav = handlerAdapter.handle(request, response, 
      controller); 
     assertViewName(mav, null); 
     assertAndReturnModelAttributeOfType(mav, "image", Image.class); 
    } 
} 

olurdu.