2017-08-23 14 views
6

मैं एक परीक्षण है:वसंत MVC नियंत्रक के साथ परीक्षण के बाद विधि अनुप्रेषित

@Test 
public void shouldAddCompany() throws Exception { 
    mockMvc.perform(post("/companies") 
      .param("name", "companyName")) 
      .andExpect(model().attribute("company", 
        hasProperty("name", is("companyName")))); 

} 

और मेरे नियंत्रक विधि की तरह दिखता है:

@PostMapping("/companies") 
public String displayCompaniesPost(@ModelAttribute Company company) { 
    companyService.save(company); 
    return "redirect:/companies"; 
} 

कैसे मैं परीक्षा में कंपनी विशेषता देख सकते हैं? रीडायरेक्ट और स्थिति 302.

java.lang.AssertionError: Model attribute 'company' 
Expected: hasProperty("name", is "companyName") 
but: was null 

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

संपादित करें (GetMapping):

@GetMapping({"/", "/companies"}) 
public String displayCompanies(Model model) { 
    model.addAttribute("company", new Company()); 
    List<Company> companies = companyService.findAll(); 
    model.addAttribute("companies", companies); 
    return "companies"; 
} 

मैंने सोचा था कि समस्या क्योंकि getMapping में एक ही नाम के साथ विशेषता addding की है, लेकिन जब मैं इसे हटा दिया, यह अभी भी काम नहीं करता।

+0

क्या आप हमें दिखा सकते हैं कि जिस पथ को आप रीडायरेक्ट कर रहे हैं उसके लिए नियंत्रक विधि भी दिखती है ('@GetMapping ("/Companies ")')? – Ben

+0

@ बेन ठीक है, मैंने पहली पोस्ट संपादित की है। मैंने सोचा कि समस्या getMapping में एक ही नाम के साथ addding विशेषता के कारण है, लेकिन जब मैंने इसे हटा दिया, यह अभी भी काम नहीं करता है। :( – Helosze

+0

आपकी परीक्षा से कंपनी की विशेषता "कंपनी नाम" नाम की उम्मीद है, लेकिन जीईटी में आप एक नई 'कंपनी' जोड़ रहे हैं जो मुझे लगता है कि इसका कोई नाम नहीं है। आपका परीक्षण शायद 'कंपनियों की तलाश में होना चाहिए 'जैसा कि नियंत्रक विधि द्वारा लौटाई गई विशेषता है जिसे आप रीडायरेक्ट कर रहे हैं। – Ben

उत्तर

3

आपको अपने दृष्टिकोण को संशोधित करने की आवश्यकता है। यदि आप नियंत्रक विधि पर पोस्ट करते हैं, और यह एक रीडायरेक्ट देता है तो आपके पास उस नियंत्रक द्वारा निर्धारित किसी भी मॉडल जानकारी तक पहुंचने की कोई क्षमता नहीं होगी, यह क्लाइंट को एक स्थान शीर्षलेख के साथ एक HTTP 302 देता है जो इसे जाने के लिए नया यूआरएल बताता है (इस मामले में GET /companies)। यदि यह सख्ती से यूनिट परीक्षण है, तो यह इस सीमा के लिए आप क्या परीक्षण कर सकते हैं इसकी सीमा है।

मैं बजाय एक एकीकरण परीक्षण के रूप में इस का इलाज करने पर विचार करेंगे, और अपने परीक्षण बदल दो अलग-अलग चरणों के लिए:

  1. पोस्ट /companies और मान्य प्रतिक्रिया की उम्मीद की जाती है कि अनुप्रेषित
  2. प्राप्त /companies और मान्य है कि लौटाई गई कंपनियों की सूची में आपके द्वारा पोस्ट की गई नई कंपनी में चरण 1
+1

ठीक है, लेकिन जब मैं पोस्ट/कंपनियां करता हूं, तो यह मेरे डेटाबेस में नई कंपनी तैयार करेगा। क्या मुझे परीक्षणों के लिए एक नया डीबी बनाना चाहिए या क्या? – Helosze

+2

हां यही वह सुझाव है जो मैं सुझाव दे रहा हूं, यदि आप उस विधि का प्रभाव चाहते हैं जो इसके इंटरफ़ेस के माध्यम से प्रकट नहीं हुआ है, तो आपको डेटास्टोर का उपयोग करके परीक्षण करने की आवश्यकता होगी। यह इन-मेमोरी डेटाबेस का एक बड़ा उपयोग है जैसे H2 – Ben

+0

ठीक है, आपकी सहायता के लिए धन्यवाद। :) – Helosze

संबंधित मुद्दे