2010-10-04 16 views
5

में का अनुरोध मान लीजिए कि मैं एक आवेदन पत्र लिख रहा हूँ चलो और मैं इस तरह कुछ करने के लिए सक्षम होना चाहिए:नकली https जावा

String url = "https://someurl/"; 
GetMethod method = new GetMethod(URLEncoder.encode(url)); 
String content = method.getResponseBodyAsString(); 

वहाँ है एक नकली सर्वर है कि मुझे संभालने दें प्रदान करने के लिए एक तरह से https अनुरोध? जो मैं खोज रहा हूं वह यूनिट परीक्षण लिखने का एक तरीका है, लेकिन मुझे उस हिस्से को नकल करने में सक्षम होना चाहिए जो वास्तव में https://someurl पर जाता है, इसलिए मुझे एक ज्ञात प्रतिक्रिया मिल सकती है।

+0

http://stackoverflow.com/q/393099/2093341 – Andrea

उत्तर

3

आप अनिवार्य रूप से दो विकल्प हैं:

1. सार ढांचे के लिए कॉल और यह परीक्षण।

उदा। किसी बिंदु पर आपको नकली कार्यान्वयन इंजेक्ट करने की अनुमति देने के लिए कोड को दोबारा दोहराएं। इसे करने के कई तरीके हैं। जैसे getUrlAsString() बनाएं और उस पर नकली करें। (ऊपर भी सुझाव दिया गया है)। या एक यूआरएल गेटर फैक्ट्री बनाएं जो GetMethod ऑब्जेक्ट देता है। कारखाने को मजाक किया जा सकता है।

2. परीक्षण के हिस्से के रूप में एक ऐप सर्वर शुरू करें और फिर इसके खिलाफ अपनी विधि चलाएं। (यह एकीकरण परीक्षण से अधिक होगा)

यह कई तरीकों से हासिल किया जा सकता है। यह परीक्षण के लिए बाहरी हो सकता है उदा। मेवेन जेटी प्लगइन। या परीक्षण प्रोग्रामेटिक रूप से सर्वर शुरू कर सकते हैं। देखें: http://docs.codehaus.org/display/JETTY/Embedding+Jetty

https पर इसे चलाने से यह जटिल होगा लेकिन यह अभी भी स्वयं हस्ताक्षरित कॉल के साथ संभव होगा। लेकिन मैं खुद से पूछूंगा - आप वास्तव में क्या परीक्षण करना चाहते हैं? मुझे संदेह है कि आपको वास्तव में https कार्यक्षमता का परीक्षण करने की आवश्यकता है, इसकी एक सिद्ध तकनीक है।

व्यक्तिगत रूप से मैं विकल्प 1 के लिए जाऊंगा - आप बाहरी पुस्तकालय की कार्यक्षमता का परीक्षण करने का प्रयास कर रहे हैं। यह आमतौर पर अनावश्यक है। बाहरी पुस्तकालयों में अपनी निर्भरताओं को सारणित करना भी अच्छा अभ्यास है।

उम्मीद है कि इससे मदद मिलती है।

1

JWebUnit http://jwebunit.sourceforge.net/

पर एक नजर डालें यहाँ एक परीक्षण का एक उदाहरण ... इसका वास्तव में काफी सहज है।

public class ExampleWebTestCase extends WebTestCase { 
    public void setUp() { 
     super.setUp(); 
     setBaseUrl("http://localhost:8080/test"); 
    } 

    public void test1() { 
     beginAt("/home"); 
     clickLink("login"); 
     assertTitleEquals("Login"); 
     setTextField("username", "test"); 
     setTextField("password", "test123"); 
     submit(); 
     assertTitleEquals("Welcome, test!"); 
    } 
} 
+0

की संभावित डुप्लिकेट हाँ, मैं JWebUnit से परिचित हूँ, लेकिन यहाँ मैं सर्व किया जा रहा वास्तविक यूआरएल उपहास करने के लिए सक्षम होना चाहिए अप। JWebUnit काम करता है जब आप जिस वेब साइट/सेवा को कॉल कर रहे हैं वह वास्तव में चल रहा है। – dcp

1

तुम हमेशा अनुरोध स्थानीय स्तर पर सेवा करने के लिए अपने इकाई परीक्षण के हिस्से के रूप में एक thttpd सर्वर लांच कर सकता है। हालांकि, आदर्श रूप से, आपके पास अच्छी तरह से परीक्षण किया गया GetMethod है, और फिर आप इसे नकल कर सकते हैं, और वास्तव में आपके सभी परीक्षणों के लिए दूरस्थ सर्वर नहीं होना चाहिए।

संसाधन

1

आप कुछ वर्ग में उस कोड लपेट और WebClient.getUrl() और फिर नकली (जैसे jmock) कि विधि संग्रहीत फ़ाइलों वापस जाने के लिए कर सकते हैं -

expectation { 
    oneOf("https://someurl/"), will(returnValue(someHTML)); 
} 
2

यदि आप यूनिट परीक्षण लिख रहे हैं, तो आप नहीं चींटी किसी बाहरी निर्भरता। एपीआई से,

GetMethod 

फैली

HttpMethod 

ताकि आप आसानी से अपने पसंदीदा मजाक पुस्तकालय के साथ यह नकली कर सकते हैं। आपका

method.getResponseBodyAsString() 

कॉल आपके इच्छित डेटा को वापस करने के लिए मजाक किया जा सकता है।

+0

लेकिन GetMethod कोड में ही बनाया जा रहा है, न कि मेरे यूनिट टेस्ट में, इसलिए मैं इसे नकल नहीं कर सकता। – dcp

+0

मुझे समझ में नहीं आता है, आप जिस कोड का परीक्षण कर रहे हैं उसे नियंत्रित नहीं करते हैं? – hvgotcodes

+0

मैं कोड को नियंत्रित करता हूं, लेकिन जिस विधि का मैं परीक्षण कर रहा हूं उसके अंदर GetMethod ऑब्जेक्ट बनाया जा रहा है, इसलिए मैं एक नकली ऑब्जेक्ट में नहीं जा सकता। जिस तरह से एक नकली काम करता है वह यह है कि आप इसे पहले से सेट करते हैं और जिस भी विधि का आप परीक्षण कर रहे हैं उसे पास कर सकते हैं, लेकिन इस मामले में, विधि के अंदर GetMethod ऑब्जेक्ट बनाया जा रहा है, इसलिए मैं इसे पास नहीं कर सकता। अगर यह है स्पष्ट नहीं है, कृपया मुझे बताएं। – dcp

2

Here's a similar question

यह JSP पृष्ठों डिबगिंग के साथ संबंधित है, लेकिन यह, स्थैतिक पृष्ठों

1

के साथ एक ही काम करता है करने के लिए क्या विस्तार आप इस मजाक में रुचि रखते हैं कॉल "जाओ" क्योंकि अगर आप देख रहे हैं एक सामान्य के लिए जावा के लिए उद्देश्य मॉकिंग फ्रेमवर्क जो जुनीट के साथ अच्छी तरह से एकीकृत करता है और ज्यूनिट सूट में शामिल होने पर स्वचालित रूप से अनुमान लगाए जाने की उम्मीदों को सेट करने की अनुमति देता है, तो आपको वास्तव में jMock पर एक नज़र रखना चाहिए।

अब अधिक कोड के बिना, यह निर्धारित करने के लिए यह आपके लिए वास्तव में क्या देख रहे हैं, लेकिन एक (कुछ बेकार) उदाहरण के लिए, उदाहरण के कोड आप ने लिखा करने के लिए कुछ इसी तरह की है, मुश्किल है कुछ इस तरह जाना होगा:

class GetMethodTest { 
@Rule public JUnitRuleMockery context = new JunitRuleMockery(); 

@Test 
public void testGetMethod() throws Exception { 
    // Setup mocked object with expectations 
    final GetMethod method = context.mock(GetMethod.class); 
    context.checking(new Expectations() {{ 
     oneOf (method).getResponseBodyAsString(); 
     will(returnValue("Response text goes here")); 
    }}); 

    // Now do the checking against mocked object 
    String content = method.getResponseBodyAsString(); 
} 
} 
+0

वास्तव में मेरे मामले में काम नहीं करेगा, मेरी टिप्पणियां hvgotcodes पर देखें। – dcp

+0

हम्म तो मैं ऑब्जेक्ट टीम जैसे जावा एक्सटेंशन फ्रेमवर्क का उपयोग करने पर विचार कर सकता हूं, जो आपके स्वयं के परिभाषित तरीकों से विशिष्ट विधि कॉल को फिर से रूट करने में सक्षम है, इस प्रकार आप इंजेक्शन के लिए बदलने के लिए आवश्यक नियंत्रण प्रवाह के सटीक बिंदु पर टैप कर सकते हैं या तो अपना कोड या अपनी मजाकिया वस्तु। इससे कोई फर्क नहीं पड़ता कि यह एक सार्वजनिक या निजी विधि है, ओब्जेक टीम्स जावा के सुपरसैट के रूप में कार्य करता है, ताकि आप चीजें कर सकें जावा सामान्य रूप से करने में सक्षम नहीं होगा। – micdah

4

जेडलर (http://jadler.net) पर एक नज़र डालें, एक http stubbing/mocking लाइब्रेरी जो मैं कुछ समय से काम कर रहा हूं। 1.0.0 स्थिर संस्करण सिर्फ जारी की गई है, यह क्षमताओं का अनुरोध आपने किया प्रदान करना चाहिए: अनुरोध पैरामीटर, हेडर, आदि के आधार पर

@Test 
public void getAccount() { 

    onRequest() 
     .havingMethodEqualTo("GET") 
     .havingURIEqualTo("/accounts/1") 
     .havingBody(isEmptyOrNullString()) 
     .havingHeaderEqualTo("Accept", "application/json") 
    .respond() 
     .withTimeout(2, SECONDS) 
     .withStatus(200) 
     .withBody("{\"account\":{\"id\" : 1}}") 
     .withEncoding(Charset.forName("UTF-8")) 
     .withContentType("application/json; charset=UTF-8"); 

    final AccountService service = new AccountServiceRestImpl("http", "localhost", port()); 
    final Account account = service.getAccount(1); 

    assertThat(account, is(notNullValue())); 
    assertThat(account.getId(), is(1)); 
} 


@Test 
public void deleteAccount() { 

    onRequest() 
     .havingMethodEqualTo("DELETE") 
     .havingPathEqualTo("/accounts/1") 
    .respond() 
     .withStatus(204); 

    final AccountService service = new AccountServiceRestImpl("http", "localhost", port()); 
    service.deleteAccount(1); 

    verifyThatRequest() 
     .havingMethodEqualTo("DELETE") 
     .havingPathEqualTo("/accounts/1") 
    .receivedOnce(); 
}