2013-12-13 10 views
12

संकलित नहीं करता है वसंत 3.2.5 → 4.0.0 संस्करण अद्यतन के बाद स्रोतों को संकलित करने का प्रयास करते समय मुझे अजीब व्यवहार है।स्प्रिंग 4 एमवीसी यूनिट परीक्षण

दोषपूर्ण कोड स्निपेट से ApplicationControllerTest.java (यह documentation से कोड के बराबर है):

import org.springframework.test.context.web.WebAppConfiguration; 
import org.springframework.test.web.servlet.MockMvc; 
import org.springframework.test.web.servlet.setup.MockMvcBuilders; 
import org.springframework.web.context.WebApplicationContext; 
... 
@Autowired 
private WebApplicationContext wac; 

private MockMvc    mockMvc; 

@Before 
public void setUp() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
} 

त्रुटि:

COMPILATION ERROR : /C:/Development/.../war/src/test/java/org/.../web/controller/ApplicationControllerTest.java:[59,61] C:\Development\...\war\src\test\java\org\...\web\controller\ApplicationControllerTest.java:59: incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) B found : <B>org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder<B> required: java.lang.Object

एक MockMvcBuilders स्रोतों में लग रहा है, एक अंतर देख सकते हैं:

वसंत 4.0.0:

public static <B extends DefaultMockMvcBuilder<B>> DefaultMockMvcBuilder<B> webAppContextSetup(WebApplicationContext context) { 
    return new DefaultMockMvcBuilder<B>(context); 
} 

वसंत 3.2.5:

public static DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>> webAppContextSetup(WebApplicationContext context) { 
    return new DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>>(context); 
} 

मेरे प्रयास यह compilable बनाने के लिए सफल नहीं किया।

असल में Spring documentation कहता है कि ढांचा जावा 1.6.0_10 संगत होना चाहिए। मैं जावा 1.6.0_45 का उपयोग करता हूं।

+0

ऐसा लगता है कि वे सीमा के साथ एक प्रकार पैरामीटर के लिए एक असीम वाइल्डकार्ड प्रकार का बदला है। मुझे लगता है कि आपने एक मुद्दा खोला होगा। –

+0

हां, मैं बदलाव देखता हूं और वे समझ में आते हैं। मुझे समझ में नहीं आता क्यों संकलक इस पैरामीट्रेशन के साथ सामना नहीं कर सकता है और मैं जेडीके 1.6.0_45 (या कोई अन्य 1.6.x संस्करण) कैसे काम कर सकता हूं। –

उत्तर

8

मुझे लगता है कि webAppContextSetup विधि का कॉल अब <B extends DefaultMockMvcBuilder<B>> की कक्षा के साथ स्पष्ट रूप से पैरामीटर किया जाना चाहिए। स्पष्ट उम्मीदवार StandaloneMockMvcBuilder या बस DefaultMockMvcBuilder (हालांकि बाद में अनचेक या असुरक्षित संचालन के बारे में चेतावनी उत्पन्न करेंगे)। तो यह प्रयास करें:

mockMvc = MockMvcBuilders.<StandaloneMockMvcBuilder>webAppContextSetup(wac).build(); 
+0

इसका मतलब है कि दस्तावेज़ीकरण सही नहीं है? शायद जेडीके 1.7 के साथ यह बिना किसी समस्या के संकलित करता है ... –

+0

@dma_k मेरे दिमाग में जेडीके संगतता के संबंध में स्प्रिंग डॉक्स में कोई संघर्ष नहीं है क्योंकि उपरोक्त कोड संकलित करता है और जेडीके 1.6 में पूरी तरह से चलाता है, छोटे पैरामीटरकरण फिक्स को देखते हुए। बल्कि वसंत का नया संस्करण पुराने के साथ संगत नहीं है। –

+0

@dma_k और हां, बेहतर प्रकार अनुमान (जैसा कि मैं इसे समझता हूं) के कारण जेडीके 1.7 और स्प्रिंग 4 में आपके मूल कोड के साथ कोई समस्या नहीं है। –

3

मैं आदेश अपने निर्माण (जावा 1.6.0_65) में इस समस्या को सुलझाने के लिए में DefaultMockMvcBuilder को webAppContextSetup टाई, और चेतावनी है कि उस से हुई को दबाने के लिए किया था।

@SuppressWarnings({"unchecked", "rawtypes"}) 
@Before 
public void setUp() 
{ 
    mockMvc = MockMvcBuilders.<DefaultMockMvcBuilder> webAppContextSetup(webApplicationContext).addFilter(springSecurityFilterChain).build(); 
} 

के रूप में एक और उत्तर StandaloneMockMvcBuilder चेतावनी के बिना काम करेंगे, तो आप पूर्ण आवेदन संदर्भ परीक्षण एकीकरण की तुलना में एक अकेले खड़े नियंत्रक परीक्षण कर रहे हैं, तो बजाय में कहा गया है।

(बस अगर मैं कर सकता था टिप्पणी की है चाहेंगे।)

3

इस स्प्रिंग फ्रेमवर्क 4.0.1 के लिए तय किया गया है।

जानकारी के लिए निम्नलिखित JIRA मुद्दा देखें: https://jira.springsource.org/browse/SPR-11238

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