2012-10-09 15 views
5

मैं अपने प्रोजेक्ट के लिए ग्रेल्स स्प्रिंग सिक्योरिटी प्लगइन का उपयोग करता हूं और अब यूनिट को अपने कोड का परीक्षण करना चाहता हूं। मैं अपने नियंत्रक में निम्न कोड है:Grails स्प्रिंग सुरक्षा परीक्षण

void testIndex() {  
    controller.index() 
    assert "/user/list" == response.redirectedUrl 
} 

इस परीक्षा में विफल रहता है:

| Running 8 unit tests... 1 of 8 
| Failure: testIndex(xxx.UserControllerTests) 
| java.lang.NullPointerException: Cannot get property 'currentUser' on null object 
    at xxx.UserController.index(UserController.groovy:12) 
    at xxx.UserControllerTests.testIndex(UserControllerTests.groovy:19) 

मैं एक वसंत सुरक्षा उपयोगकर्ता कैसे प्रमाणित कर सकते हैं

def index() { 
    redirect action: 'show', params: [id: springSecurityService.currentUser.id] 
} 

मेरे टेस्ट कक्षा निम्नलिखित कोड है एक परीक्षण मामले में? आप इकाई परीक्षण कैसे लिखेंगे?

उत्तर

0

ऐसा प्रतीत होता है कि springSecurityService का आपका संदर्भ शून्य है। जब तक आपके पास springSecurityService नामक आपके नियंत्रक में कोई फ़ील्ड है, तो इसे इंजेक्शन दिया जाना चाहिए। क्या आप इसे केवल अपनी इंडेक्स विधि में स्थानीय चर के रूप में उपयोग कर रहे हैं और इसे फ़ील्ड के रूप में घोषित नहीं किया है?

मेरे UserController इस प्रकार है: यह जवाब देने के लिए अपनी टिप्पणी के आधार पर

class UserController { 

    /** 
    * Dependency injection for the springSecurityService. 
    */ 
    def springSecurityService 

    .... 
} 

अद्यतन

, आप अपने नियंत्रक में एक springSecurityService क्षेत्र घोषित किया था। मैं अपने काम कर आवेदन ले लिया और एक परीक्षण है कि तुम्हारा मेरी नियंत्रक विधि के साथ दर्पण की कोशिश की:

@TestFor(UserController) 
class UserControllerTests { 

    void testSomething() { 
     controller.register() 
    } 
} 

मैं एक NullPointerException रूप में अच्छी तरह मिला है। बर्ट के उत्तर से, (मुझे यह नहीं पता था), मुझे लगता है कि springSecurityService उदाहरण यूनिट टेस्ट निष्पादन के संदर्भों में शून्य है।

+0

मेरी नियंत्रक में मेरे पास है: वर्ग UserController { \t \t डीईएफ़ springSecurityService ... – Nadya

+0

मुझे लगता है कि लिख चाहिए ControllerTest में? – Nadya

+0

@ user1726376 नहीं, आपको कंट्रोलरटेस्ट में इसकी आवश्यकता नहीं है। मैं बस यह सुनिश्चित कर रहा था कि आपके पास 'springSecurityService' का संदर्भ था, इस तथ्य के कारण कि आपके पास त्रुटि संदेश "प्रॉपर्टी नहीं मिल सकता है" वर्तमान उपयोगकर्ता' शून्य ऑब्जेक्ट पर '। –

3

इस सरल कुछ मैं जटिल mocks से परेशान नहीं होता के लिए, एक सरल

controller.springSecurityService = [currentUser:[id:1]] 

पर्याप्त होगा।

+0

यह काम नहीं करता है। मुझे 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: क्लास 'java.util.LinkedHashMap' कक्षा 'grails.plugin.springsecurity.SpringSecurityService' के कारण ऑब्जेक्ट '{currentUser = {id = 1}}' ऑब्जेक्ट नहीं डाला जा सकता है। करने के लिए: groovy.lang.ReadOnlyPropertyException: केवल पढ़ने योग्य संपत्ति सेट नहीं कर सकता: कक्षा के लिए वर्तमान उपयोगकर्ता: grails.plugin.springsecurity.SpringSecurityService' – lmo

+0

@lmo मैंने जो सुझाव दिया है, वह केवल तभी काम करेगा यदि आप अपने नियंत्रक में 'def springSecurityService' का उपयोग करते हैं, तो यह जीता यदि आपके पास टाइप की गई घोषणा 'SpringSecurityService SpringSecurityService' है तो काम नहीं करें –

7

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

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