2012-06-20 16 views
8

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

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

public class AccountsControllerTest { 
    private controllers.Accounts accountsController; 

    @Test 
    public void test() { 
     running(fakeApplication(), new Runnable() { 
      public void run() { 
       accountsController = new controllers.Accounts(); 
       accountsController.setAccountsWorkflow(mock(workflow.Accounts.class)); 
      } 
     }); 
    } 
} 

स्पष्ट समस्या यहाँ है कि मैं परीक्षण के अंतर्गत मेरी कक्षा instantiating रहा हूँ और परीक्षा पद्धति ही है, से नकली निर्भरता इंजेक्शन है जब मैं setup() विधि में ऐसा करना चाहिए। ऐसा लगता है कि setup() विधि बेकार है अगर मैं पारंपरिक रूप से अपने नियंत्रक का परीक्षण करने जा रहा हूं।

बेशक मैं नियंत्रकों the way Play recommends का परीक्षण कर सकता हूं, लेकिन मेरा आवेदन बाहरी एसओएपी वेब सेवा पर निर्भर है, इसलिए मुझे यह दिखाने के लिए यूनिट परीक्षण की आवश्यकता है कि हमारा सर्वर काम कर रहा है जब हमारा सर्वर काम कर रहा है।

तो, setup() और teardown() विधियों का लाभ उठाते हुए, मैक का उपयोग करके एक प्ले नियंत्रक को यूनिट का परीक्षण करने का सबसे अच्छा तरीका क्या है?

संपादित

मुझे पता है मैं कुछ ज्ञान यहां संभालने रही है, इसलिए के लिए जो लोग अनजान हैं, एक इकाई परीक्षण में नियंत्रक इन्स्टेन्शियशन एक running() समारोह में लिपटे किया जाना चाहिए या खेलने के लिए! रनटाइम अपवाद फेंक देगा कि कोई आवेदन शुरू नहीं हुआ है।

+0

http://www.joergviola.de/blog/2012/06/04/page-driven-functional-tests-for-play-2-dot-0/ परीक्षण के लिए एक अच्छा तरीका भी है, लेकिन अभी भी नकली समस्या है। आप नकली आवेदन के बिना परीक्षण चलाने की कोशिश कर सकते हैं। Http://stackoverflow.com/questions/10381354/how-to-manipulate- सत्र-request-and-response-for-test-in-play2-0 – niels

+0

http://stackoverflow.com/a/10114621/89509 देखें उदाहरण के लिए –

+0

धन्यवाद। आप 'चल रहे 'फ़ंक्शन के बाहर नियंत्रक को तुरंत चालू करने में सक्षम कैसे थे? यह बाधा मुझे जुनीट की 'सेटअप' पद्धति का लाभ उठाने से रोकती है, इसलिए मुझे हर टेस्ट विधि पर मोज़े लगाने की ज़रूरत नहीं है। आपका उदाहरण वास्तव में इसका प्रदर्शन नहीं करता है। – Samo

उत्तर

1

आप इसे मॉकिटो और प्ले के नकली अनुप्रयोग का उपयोग करके और स्थिर Http.Context चर सेट करके इसे पूरा कर सकते हैं।

इस तरह आप अन्य सभी जुनीट परीक्षण की तरह परीक्षण लिख सकते हैं।

उदाहरण:

... 
import static play.test.Helpers.status; 
import play.test.FakeApplication; 
import play.test.Helpers; 
import play.mvc.Http; 
import play.mvc.Result; 
... 

@RunWith(MockitoJUnitRunner.class) 
public class ApplicationTest { 

    public static FakeApplication app; 

    @Mock 
    private Http.Request request; 

    @BeforeClass 
    public static void startApp() { 
     app = Helpers.fakeApplication(); 
     Helpers.start(app); 

    } 

    @Before 
    public void setUp() throws Exception { 
     Map<String, String> flashData = Collections.emptyMap(); 
     Http.Context context = new Http.Context(request, flashData, flashData); 
     Http.Context.current.set(context); 
    } 

    @Test 
    public void testIndex() { 
     final Result result = Application.index(); 
     assertEquals(play.mvc.Http.Status.OK, status(result)); 
    } 

    @AfterClass 
    public static void stopApp() { 
     Helpers.stop(app); 
    } 
+0

मुझे नहीं पता था कि आप वर्तमान Http.Context को इस तरह सेट कर सकते हैं - यह अच्छा है; धन्यवाद। – duma

+0

मैंने पाया कि 'Http.Context.current.set (संदर्भ) को सेट करके;' मेरे बाद के परीक्षण पर निर्भर परीक्षण विफल रहे। इसलिए आपको संदर्भ को अपने मूल स्थिति में @AfterClass में सेट करना होगा। –