2009-05-14 13 views
18

वसंत MVC के साथ, आप निर्दिष्ट कर सकते हैं कि एक विशेष यूआरएल एक विशेष विधि द्वारा नियंत्रित किया जाएगा, और आप निर्दिष्ट कर सकते हैं कि विशेष रूप से मानकों को इतना की तरह विशेष रूप से तर्क करने के लिए नक्शे होगा,:परीक्षण स्प्रिंग MVC एनोटेशन mapppings

@Controller 
public class ImageController { 

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

} 

यह सब ठीक है और अच्छा है, लेकिन अब मैं परीक्षण करना चाहता हूं कि एक छवि के साथ एक http अनुरोध पैरामीटर इस विधि को सही तरीके से बुलाएगा। दूसरे शब्दों में, मैं एक परीक्षा चाहता हूं जो किसी भी एनोटेशन को हटा या बदलने के लिए तोड़ देगा। क्या इसे करने का कोई तरीका है?

यह जांचना आसान है कि इमेज सही तरीके से काम करता है। मैं सिर्फ एक छवि नियंत्रक बना सकता हूं और उचित तर्क के साथ getImage का आह्वान कर सकता हूं। हालांकि, यह परीक्षण का केवल एक आधा है। परीक्षण का दूसरा आधा होना चाहिए कि क्या उचित HTTP अनुरोध आने पर स्प्रिंग फ्रेमवर्क द्वारा इमेज() को आवंटित किया जाएगा। मुझे लगता है कि मुझे इस भाग के लिए भी एक परीक्षण की आवश्यकता है, विशेष रूप से मेरे @RequestMapping एनोटेशन अधिक जटिल हो जाते हैं और जटिल पैरामीटर की स्थिति।

क्या आप मुझे एक परीक्षण दिखा सकते हैं जो मैं 4, @RequestMapping("getImage") हटा सकता हूं तो तोड़ देगा?

+1

मैं आपके प्रश्न को पूरी तरह से समझ नहीं पा रहा हूं। क्या आपका मतलब है "स्प्रिंग एमवीसी नियंत्रकों के लिए यूनिट टेस्ट कैसे बनाएं जो एनोटेशन मैपिंग का उपयोग करें?" –

+0

क्षमा करें। मेरा मतलब है कि मैं परीक्षण करना चाहता हूं कि एनोटेशन सही है, और एक HTTP अनुरोध वास्तव में इस विधि का आह्वान करेगा। –

उत्तर

12

आप प्रोग्रामिंग के AnnotationMethodHandlerAdapter और इसकी handle विधि का उपयोग कर सकते हैं। यह दिए गए अनुरोध के लिए विधि को हल करेगा और इसे निष्पादित करेगा। दुर्भाग्य से यह थोड़ा अप्रत्यक्ष है। असल में एएमएचए में ServletHandlerMethodResolver नामक एक निजी वर्ग है जो किसी दिए गए अनुरोध के लिए विधि को हल करने के लिए ज़िम्मेदार है। मैंने उस विषय पर अभी request for improvement दायर किया है, क्योंकि मैं वास्तव में यह भी संभव देखना चाहता हूं।

इस बीच आप उदा। EasyMock अपने कंट्रोलर क्लास का एक मॉक बनाने के लिए, दी गई विधि को लागू करने की उम्मीद करें और handle पर नकली हाथ दें।

नियंत्रक:

@Controller 
public class MyController { 

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

    // your controller code 
    } 
} 

टेस्ट:

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); 
    } 
} 

सादर, ओली

+0

एक अतिरिक्त पंक्ति जोड़ें: 'request.setAttribute (HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, Boolean.TRUE); 'जब आप नियंत्रक स्तर मैपिंग का उपयोग कर रहे हों तो इसकी आवश्यकता होती है – takacsot

6

ओली का समाधान कैसे परीक्षण करने के लिए के व्यापक प्रश्न के बारे में एक टिप्पणी के के विशिष्ट उदाहरण लेकिन क्या परीक्षण को शामिल किया गया अन्य सभी विभिन्न वसंत एमवीसी एनोटेशन। मेरे दृष्टिकोण (है कि आसानी से अन्य एनोटेशन के लिए बढ़ाया जा सकता है) होगा

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); 
    } 
} 

मैं भी एक blog entry about integration testing Spring MVC annotations लिखा है।