2015-11-04 19 views
7

मैं Spring Boot रेस्ट कंट्रोलर का परीक्षण करना चाहता हूं, जिसे Spring security का उपयोग करके सुरक्षित किया गया है, और इसके अंदर मैक्स का उपयोग करें। मैंने मॉकिटो के साथ कोशिश की है, लेकिन मुझे लगता है कि किसी भी मॉकिंग टूल को चाल चलनी चाहिए।स्प्रिंग मॉकएमवीसी, स्प्रिंग सुरक्षा और मॉकिटो

मेरी परीक्षणों में वसंत सुरक्षा को सक्षम करने के मैं पहली बार इस प्रकार किया:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Main.class) 
@TestPropertySource(value="classpath:application-test.properties") 
@WebAppConfiguration 
@ContextConfiguration 
public class MyTest{ 

    protected MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext wac; 

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

    @Test 
    public void doTheTest(){ 
     mockMvc.perform(post("/user/register") 
      .with(SecurityMockMvcRequestPostProcessors.csrf()) 
      .content(someContent())); 
    } 
} 

वहाँ तक, यह अच्छी तरह से काम करता है।

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

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Main.class) 
@TestPropertySource(value="classpath:application-test.properties") 
@WebAppConfiguration 
@ContextConfiguration 
public class MyTest{ 

    protected MockMvc mockMvc; 

    @Mock 
    private Myservice serviceInjectedInController; 

    @InjectMocks 
    private MyController myController; 

    @Autowired 
    private WebApplicationContext wac; 

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

    @Test 
    public void doTheTest(){ 
     mockMvc.perform(post("/user/register") 
      .with(SecurityMockMvcRequestPostProcessors.csrf()) 
      .content(someContent())); 
    } 
} 

दुर्भाग्य से, मज़ाक उड़ाया सेवा, नियंत्रक में इंजेक्ट किया जाता है नहीं के रूप में वहाँ MockMVC और Mocks संबंधित कुछ भी नहीं है, इसलिए mocks नियंत्रक में इंजेक्शन नहीं कर रहे हैं।

तो मैं MockMVC का विन्यास बदलने की कोशिश की, इस प्रकार है:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Main.class) 
@TestPropertySource(value="classpath:application-test.properties") 
@WebAppConfiguration 
@ContextConfiguration 
public class MyTest{ 

    protected MockMvc mockMvc; 

    @Mock 
    private Myservice serviceInjectedInController; 

    @InjectMocks 
    private MyController myController; 


    @Before 
    public void setUp(){ 
     mockMvc = MockMvcBuilders 
       .standAloneSetup(myController) 
       .apply(SecurityMockMvcConfigurers.springSecurity()) 
       .build(); 
    } 

    @Test 
    public void doTheTest(){ 
     mockMvc.perform(post("/user/register") 
      .with(SecurityMockMvcRequestPostProcessors.csrf()) 
      .content(someContent())); 
    } 
} 

लेकिन इस मामले में, मैं कोई अन्य समस्या है। स्प्रिंग सुरक्षा विन्यास के बारे में शिकायत की है:

java.lang.IllegalStateException: springSecurityFilterChain cannot be null. Ensure a Bean with the name springSecurityFilterChain implementing Filter is present or inject the Filter to be used. 

मैं कोई अन्य विचार सुरक्षा और मजाक बनाने के लिए किया है। कोई उपाय? या मुझे एक और तरीका करना चाहिए?

धन्यवाद।

+0

आप स्प्रिंग सुरक्षा का उपयोग कर रहे 4 संस्करण: स्पष्ट का उपयोग कर springSecurityFilterChain प्रदान कर सकते हैं? – Ritesh

+0

मैं स्प्रिंग-बूट 1.2.7.RELEASE का उपयोग कर रहा हूं और मैंने 4.0.2 –

+0

@Remi का उपयोग करने के लिए डिफ़ॉल्ट स्प्रिंग सुरक्षा को ओवरराइड किया है क्या आपने कभी इसे हल किया है? – hvgotcodes

उत्तर

9

डिफ़ॉल्ट रूप से एकीकरण "springSecurityFilterChain" के नाम से एक बीन की तलाश करता है। उदाहरण प्रदान किए गए उदाहरण में, एक स्टैंडअलोन सेटअप का उपयोग किया जा रहा है जिसका अर्थ है MockMvc परीक्षण के भीतर प्रदान किए गए WebApplicationContext से अवगत नहीं होगा और इस प्रकार "springSecurityFilterChain" बीन को देखने में सक्षम नहीं होगा।

इसका समाधान करने के लिए सबसे आसान तरीका कुछ इस तरह उपयोग करने के लिए है:

MockMvc mockMvc = MockMvcBuilders 
      // replace standaloneSetup with line below 
      .webAppContextSetup(wac) 
      .alwaysDo(print()) 
      .apply(SecurityMockMvcConfigurers.springSecurity()) 
      .build(); 

तुम सच में (वास्तव में कोई मतलब नहीं है क्योंकि आप पहले से ही एक WebApplicationContext है) एक standaloneSetup का उपयोग करना चाहते हैं, तो आप

@Autowired 
FilterChainProxy springSecurityFilterChain; 

@Before 
public void startMocks(){ 
    controller = wac.getBean(RecipesController.class); 

    MockMvc mockMvc = MockMvcBuilders 
      .standaloneSetup(controller) 
      .alwaysDo(print()) 
      .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain)) 
      .build(); 

    MockitoAnnotations.initMocks(this); 
} 
+0

मुझे बताएं कि क्या मैं गलत हूं, लेकिन 'स्टैंडअलोनसेटअप' का उपयोग करने के लिए नियंत्रक पर पर्याप्त नियंत्रण रखने का एकमात्र तरीका है जो अंदर मोक्स इंजेक्ट करने में सक्षम है। क्या कोई और तरीका है? –

+0

आप एक परीक्षण कॉन्फ़िगरेशन बना सकते हैं जो आपकी सेवाओं के लिए मोक्स प्रदान करता है। फिर उस कॉन्फ़िगरेशन को बहिष्कृत करें जिसमें वास्तविक सेवाएं हों। वैकल्पिक रूप से, आप दोनों कॉन्फ़िगरेशन का उपयोग कर सकते हैं और सेवाओं के नकली संस्करण पर 'प्राथमिक' चिह्नित कर सकते हैं। उम्मीदों को स्थापित करने और सत्यापित करने के लिए आप नकली सेवाओं में 'ऑटोवायर' कर सकते हैं। –

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