2012-01-20 21 views
12

मेरे पास @ सुरक्षित के साथ एनोटेटेड एक सशर्त विधि है। मैं इस विधि के लिए एक यूनिट टेस्ट लिखने की कोशिश कर रहा हूं, लेकिन मेरा परीक्षण विफल रहता है क्योंकि मुझे विधि को कॉल करने के लिए प्रमाणीकरण की आवश्यकता है। विधि स्वयं, सहेजने() विधि होती है। त्रुटि मैं जब मैं विधि कॉल है:मैकिंग प्रमाणीकरण वसंत सुरक्षा

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 

मैं इस विधि का परीक्षण नहीं कर सकते क्योंकि यह प्रमाणीकरण की आवश्यकता है, और मैं के खिलाफ प्रमाणित करने के लिए कोई उपयोगकर्ता नहीं बचा सकता है (मैं HSQLDB उपयोग कर रहा हूँ) क्योंकि मैं इस कॉल करने के लिए की आवश्यकता होगी बचाने के लिए विधि। @secured के साथ एनोटेटेड विधि या प्रमाणीकरण को नकल करने के तरीके को यूनिट करने के तरीके के बारे में कोई सलाह।

उत्तर

15

यह इस बात पर निर्भर करता है कि आप क्या परीक्षण करना चाहते हैं।

  • यदि आप बिना किसी सुरक्षा सामग्री के अपने एप्लिकेशन के व्यावसायिक तर्क का परीक्षण करना चाहते हैं, तो आप सुरक्षा को पूरी तरह से अक्षम कर सकते हैं। मान लें कि आप SpringJunit4Runner का उपयोग करते हैं, आप सुरक्षा कॉन्फ़िगरेशन को अलग फ़ाइल में डाल सकते हैं और इसे @ContextConfiguration में शामिल नहीं कर सकते हैं।

  • आप प्राधिकरण परीक्षण करने के लिए (@Secured एनोटेशन जैसे सही काम) चाहते हैं, आप SecurityContext सीधे उपयोग कर सकते हैं, सभी प्रमाणीकरण से संबंधित सामान (दरकिनार इस मामले आप अलग फ़ाइल में प्रमाणीकरण विन्यास डाल सकते हैं और यह लोड नहीं में साथ ही): अंत में आप प्रमाणीकरण का परीक्षण करना चाहते हैं, तो आप डेटाबेस युक्त परीक्षण डाटा के साथ परीक्षण चला सकते हैं

    @Test 
    public void myTest() { 
        login(...); 
        ... 
        logout(); 
    } 
    
    private void login(...) { 
        SecurityContextHolder.getContext().setAuthentication(
         new UsernamePasswordAuthenticationToken(...) 
        ) 
    } 
    
    private void logout() { 
        SecurityContextHolder.clearContext(); 
    } 
    
  • ,:

    आपको बस SecurityContextHolder में एक उपयुक्त Authentication वस्तु डाल करने के लिए है ।

+0

दुर्भाग्य से मैं यह नहीं कर सकता। मेरा प्रमाणीकरण प्रबंधक एक कस्टम userDetailService है जो उपयोगकर्ता को डेटाबेस से लाने के लिए मेरे भंडार का उपयोग करता है। इसलिए यदि मैं उपयोगकर्ता को दृढ़ता से सहेज नहीं सकता, तो उपयोगकर्ताDetailsService उपयोगकर्ता को नहीं ढूंढ पाएगा, और इस प्रकार एक BadCredentials अपवाद में परिणाम होगा। –

+0

@vikashdat: – axtavt

5

ए) यह यूनिट परीक्षण नहीं है, यह एकीकरण परीक्षण है। एक इकाई परीक्षण कोई समस्या नहीं होगी।

बी) मैं आपके परीक्षण सेटअप को अलग रखने की कोशिश करता हूं। परीक्षणों में केवल निष्क्रिय वसंत सुरक्षा क्यों नहीं है जहां आप सुरक्षा से संबंधित सुविधाओं का परीक्षण नहीं कर रहे हैं?

सी) यदि अन्य सभी विफल हो जाते हैं: JdbcTemplate ऑब्जेक्ट इंजेक्ट करें और परीक्षण सेटअप के दौरान SQL में मैन्युअल रूप से उपयोगकर्ता डेटा बनाएं। Support classes for integration testing

+0

अपडेट किया गया मुझे नहीं पता था कि रनटाइम पर सुरक्षा को निष्क्रिय करना संभव था। क्या आपके पास एक संसाधन है जिसे आप सुरक्षा को निष्क्रिय करने के तरीके को देखने के लिए भी मुझसे जोड़ सकते हैं? –

+0

@vikashdat इसे दूसरी तरफ करें: इसे सक्रिय न करें। बेशक यह इस बात पर निर्भर करता है कि यह किस तरह का परीक्षण है। यदि आप एक तैनात सर्वर के खिलाफ परीक्षण कर रहे हैं जो एक विकल्प नहीं हो सकता है। –

+0

मुझे यकीन है कि मैं understand..how मैं इसे सक्रिय नहीं कर सकते नहीं कर रहा हूँ? क्या आपका मतलब SpringJunit4Runner के साथ परीक्षण नहीं चल रहा है? अगर मैं ऐसा करता हूं, तो मैं घटकों को स्वचालित करने की क्षमता खो दूंगा। –

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