java - JUnit परीक्षण में सत्यापन शुरू करने के लिए मैं स्प्रिंग एमवीसी कैसे प्राप्त करूं?




spring spring-mvc (2)

मूल रूप से आपने इस। this.controller = new MyController() साथ एक POJO को तत्काल this.controller = new MyController() , फिर इसकी विधि को this.controller.add(...) कहा जाता है। सरल वस्तु के साथ सरल जावा, बिना किसी संदर्भ के: @ वालिड को ध्यान में नहीं रखा जाता है।

@ कॉन्टेक्स कॉन्फ़िगरेशन संभवतया संभवतः कस्टम वैद्यकताओं के साथ संभवतः आपके संभव बीन्स को लोड करेगा, लेकिन यह @ वालिद के प्रोसेसिंग का जादू नहीं करेगा।

आपको क्या चाहिए नियंत्रक की add विधि के अनुरोध का अनुकरण करने के लिए कुछ है इसे पूरी तरह से अनुकरण, सत्यापन शामिल है। आप ऐसा करने से बहुत दूर नहीं थे, क्योंकि आपने कुछ स्प्रिंग परीक्षण सुविधाएं (एक MockHttpServletRequest को इन्स्तांत करने के लिए) का इस्तेमाल किया था

यदि आप स्प्रिंग 3.0.x या उससे कम का उपयोग करते हैं , तो आपको करने की ज़रूरत है

new AnnotationMethodHandlerAdapter()
      .handle(request, new MockHttpServletResponse(), this.controller);

इसे काम करने के लिए

यदि आप स्प्रिंग 3.1+ का उपयोग करते हैं , तो उपरोक्त समाधान काम नहीं करेगा ( अधिक जानकारी के लिए इस लिंक को देखें )! अगले वसंत संस्करण में उन्हें एकीकृत करने के लिए इंतजार करते समय आपको इस पुस्तकालय (स्प्रिंग टीम से, इसलिए यह चिंता न करें) का उपयोग करने की आवश्यकता होगी तब आपको कुछ करना होगा

myMockController = MockMvcBuilders.standaloneSetup(new MyController()).build();
myMockController.perform(get("/browser/create")).andExpect(...);

Rossen Stoyanchev (यहां जिस भाग के बारे में बात कर रहे हैं, वह स्लाइड # 116 पर शुरू होता है) से इन बहुत रोचक स्लाइडों पर भी नज़र डालें!

नोट: मैं इस तरह के परीक्षण को इकाई परीक्षण या एकीकरण परीक्षण के रूप में माना जाता है या नहीं, इस बात की बहस में दर्ज नहीं होगा। कुछ लोग कहते हैं कि यह एकीकरण परीक्षण है जो हम यहां कर रहे हैं, क्योंकि हम अनुरोध के पूर्ण पथ का अनुकरण करते हैं। लेकिन दूसरी तरफ आप अपने नियंत्रक को मॉकिटो (जैसे किसी भी अन्य मजाकिया ढांचे के साथ समान सामान करते हैं) की तरह @ मैक एनोटेशन के साथ मॉक कर सकते हैं, तो कुछ अन्य यह कहेंगे कि आप परीक्षण के दायरे को लगभग शुद्ध "इकाई परीक्षण" से कम कर सकते हैं । बेशक, आप वैकल्पिक रूप से और विशुद्ध रूप से यूनिट अपने नियंत्रक को सादे पुराने जावा + एक मजाक के ढांचे के साथ परीक्षण कर सकते हैं, लेकिन इस मामले में यह आपको @ वैध सत्यापन का परीक्षण करने की अनुमति नहीं देगा। अपनी पसंद करें ! :)

मेरे पास पॉज़ो नामक ब्राउज़र है जिसे मैंने हाइबरनेट वैलिडेटर एनोटेशन के साथ एनोटेट किया है।

import org.hibernate.validator.constraints.NotEmpty;

public class Browser {

    @NotEmpty
    private String userAgent;
    @NotEmpty
    private String browserName;

...

}

मैंने निम्नलिखित यूनिट परीक्षण लिखा है जो मेरी नियंत्रक विधि को सत्यापित करने की कोशिश करता है सत्यापन त्रुटियों को पकड़ता है

@Test
public void testInvalidData() throws Exception {
    Browser browser = new Browser("opera", null);
    MockHttpServletRequest request = new MockHttpServletRequest();

    BindingResult errors = new DataBinder(browser).getBindingResult();
    // controller is initialized in @Before method
    controller.add(browser, errors, request);
    assertEquals(1, errors.getErrorCount());
}

यहां मेरा नियंत्रक जोड़ें () विधि है:

@RequestMapping(value = "/browser/create", method = RequestMethod.POST)
public String add(@Valid Browser browser, BindingResult result, HttpServletRequest request) throws Exception {
    if (result.hasErrors()) {
        request.setAttribute("errorMessage", result.getAllErrors());
        return VIEW_NAME;
    }

    browserManager.save(browser);

    request.getSession(false).setAttribute("successMessage",
            String.format("Browser %s added successfully.", browser.getUserAgent()));

    return "redirect:/" + VIEW_NAME;
}

जो समस्या मैं अनुभव कर रहा हूं वह है कि परिणाम में कभी त्रुटियां नहीं होती हैं, इसलिए यह @ वालिद की तरह मान्यता प्राप्त नहीं हो रही है मैंने अपने परीक्षण वर्ग में निम्नलिखित को जोड़ने की कोशिश की, लेकिन यह समस्या को हल नहीं करता है।

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:path-to/WEB-INF/spring-mvc-servlet.xml"})

क्या किसी को पता है कि मैं कैसे जानती हूं (मान्यता प्राप्त) वैधता के साथ?

धन्यवाद,

मैट


सत्यापन नियंत्रक को कॉल करने से पहले किया जाता है, इसलिए आपका परीक्षण इस मान्यता को लागू नहीं कर रहा है।

नियंत्रकों का परीक्षण करने के लिए एक और तरीका है, जहां आप सीधे नियंत्रक का इस्तेमाल नहीं करते हैं इसके बजाय आप उस यूआरएल का निर्माण और कॉल करते हैं जो नियंत्रक पर मैप किया जाता है। यह कैसे करें यह एक अच्छा उदाहरण है: http://rstoyanchev.github.com/spring-31-and-mvc-test/#1

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=WebContextLoader.class, locations = {"classpath:/META-INF/spring/applicationContext.xml", "classpath:/META-INF/spring/applicationContext-test-override.xml", "file:src/main/webapp/WEB-INF/spring/webmvc-config.xml"})
public class MyControllerTest {
@Autowired
WebApplicationContext wac;
MockMvc mockMvc;

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders.webApplicationContextSetup(this.wac).build();
}

@Test
@Transactional
public void testMyController() throws Exception {
    this.mockMvc.perform(get("/mycontroller/add?param=1").accept(MediaType.TEXT_HTML))
    .andExpect(status().isOk())
    .andExpect(model().attribute("date_format", "M/d/yy h:mm a"))
    .andExpect(model().attribute("myvalue", notNullValue()))
    .andExpect(model().attribute("myvalue", hasSize(2)))
    .andDo(print());
}
}

पीओएम (वसंत मील का पत्थर रेपो का उपयोग करने की आवश्यकता है):

    <!-- required for spring-test-mvc -->
    <repository>
        <id>spring-maven-milestone</id>
        <name>Spring Maven Milestone Repository</name>
        <url>http://maven.springframework.org/milestone</url>
    </repository>
...
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test-mvc</artifactId>
        <version>1.0.0.M1</version>
        <scope>test</scope>
    </dependency>

नोट: वसंत-एमवीसी-परीक्षण लिब अभी तैयार नहीं है कार्यान्वयन में कुछ अंतराल हैं मुझे लगता है कि इसकी योजना वसंत 3.2 के लिए पूरी तरह कार्यान्वित होने की है।

यह दृष्टिकोण एक महान विचार है क्योंकि यह आपके नियंत्रकों को पूरी तरह से जांचता है। अपने नियंत्रक मैपिंग को गड़बड़ करना आसान है, इसलिए इन्हें वास्तव में इकाई परीक्षण करने की आवश्यकता है







bean-validation