2009-03-03 15 views
27

मैं एक नकली वेब सर्वर का उपयोग कर एक यूनिट परीक्षण बनाना चाहता हूं। क्या जावा में कोई वेब सर्वर लिखा गया है जिसे आसानी से शुरू किया जा सकता है और जुनीट टेस्ट केस से रोक दिया जा सकता है?जावा में यूनिट परीक्षण के लिए वेब सर्वर का नकल कैसे करें?

+2

कार्य एक इकाई परीक्षण नहीं, एकीकरण परीक्षण बनाने की तरह दिखता है। –

उत्तर

11

Simple (Maven) को यूनिट परीक्षण में एम्बेड करना बहुत आसान है। RoundTripTest और उदाहरण के साथ PostTest जैसे उदाहरण लें। सर्वर को आपके टेस्ट केस में एम्बेड करने का उदाहरण प्रदान करता है।

भी सरल कोई निर्भरता के साथ बहुत हल्का और घाट की तुलना में तेजी है। तो आपको अपने क्लासपाथ पर कई जार जोड़ने की ज़रूरत नहीं है। न ही आपको WEB-INF/web.xml या किसी अन्य कलाकृतियों से चिंतित होना होगा।

+2

हालांकि यह संभवतः उपयोगकर्ता चाहता था, यह "नकली" वेब सर्वर नहीं है, यह एक वास्तविक वेब सर्वर है जो यूनिट परीक्षण के भीतर लॉन्च किया गया है।उदाहरण के लिए, यदि बंदरगाह लिया गया तो यह असफल हो जाएगा, इसलिए एक वास्तविक नकली नहीं (यानी सिस्टम से बाहरी निर्भरता है)। मार्टिन फाउलर के नामकरण के अनुसार ["टेस्ट डबल्स"] (http://www.martinfowler.com/bliki/TestDouble.html), यह एक "नकली" है। उस ने कहा, यह ** बिल्कुल ** था जो मैं खोज रहा था। – ArtB

+0

क्या यह परियोजना निष्क्रिय हो गई? – kbolino

18

आप एक mock or an embedded वेब सर्वर का उपयोग करने की कोशिश कर रहे हैं? , आप Jetty इस्तेमाल कर सकते हैं

MyServlet servlet = new MyServlet(); 
HttpServletRequest mockRequest = mock(HttpServletRequest.class); 
HttpServletResponse mockResponse = mock(HttpServletResponse.class); 

StringWriter out = new StringWriter(); 
PrintWriter printOut = new PrintWriter(out); 
when(mockResponse.getWriter()).thenReturn(printOut); 

servlet.doGet(mockRequest, mockResponse); 

verify(mockResponse).setStatus(200); 
assertEquals("my content", out.toString()); 

एक एम्बेडेड वेब सर्वर के लिए,:

एक नकली वेब सर्वर के लिए, Mockito, या कुछ इसी तरह का उपयोग करके देखें, और सिर्फ HttpServletRequest और HttpServletResponse वस्तुओं की तरह नकली जो आप use in tests कर सकते हैं।

6

पर एक नज़र एक और अच्छा विकल्प MockServer होगा है; यह एक धाराप्रवाह इंटरफ़ेस प्रदान करता है जिसके साथ आप मजाक किए गए वेब सर्वर के व्यवहार को परिभाषित कर सकते हैं।

+0

इसके अलावा मॉकसेवर नेटी (जेटी नहीं) पर निर्भर करता है। –

19

Wire Mock स्टब्स का एक ठोस सेट की पेशकश करने लगता है और बाहरी वेब सेवाओं के परीक्षण के लिए मजाक उड़ाता है।

@Rule 
public WireMockRule wireMockRule = new WireMockRule(8089); 


@Test 
public void exactUrlOnly() { 
    stubFor(get(urlEqualTo("/some/thing")) 
      .willReturn(aResponse() 
       .withHeader("Content-Type", "text/plain") 
       .withBody("Hello world!"))); 

    assertThat(testClient.get("/some/thing").statusCode(), is(200)); 
    assertThat(testClient.get("/some/thing/else").statusCode(), is(404)); 
} 

यह भी स्पॉक के साथ एकीकृत कर सकता है। उदाहरण here मिला।

+0

यह मेरे लिए बहुत अच्छा काम करता है। WireMockConfig() का उपयोग करना। डायनामिकपोर्ट() इसे एक सेटिंग में अधिक अनुमानित बनाता है जहां अन्य प्रोग्राम पोर्ट का उपयोग कर सकते हैं। काश यह डिफ़ॉल्ट था क्योंकि मैं लगभग इस संभावना को याद करता था और इस महान पुस्तकालय को छोड़ देता था। – morten

+0

आपके द्वारा प्रदान किए गए कोड में testClient क्या है? – gribo

+0

@gribo मुझे लगता है कि testClient परीक्षण के तहत आपका वास्तविक उदाहरण है। – Stephan

5

आप जाडलर (http://jadler.net) को आजमा सकते हैं, जो आपके परीक्षणों में http संसाधनों को स्टब और नकल करने के लिए एक धाराप्रवाह प्रोग्रामैटिक जावा एपीआई वाली लाइब्रेरी है। उदाहरण:

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

मैंने जैडलर का उपयोग करने की कोशिश की लेकिन जब भी मैं 'initJadler()' को कॉल करने का प्रयास कर रहा हूं, मुझे त्रुटि मिली है जैसा कि https://github.com/jadler-mocking/jadler/issues/107 बताया गया है। कोई विचार क्या गलत हो सकता है? – tuk

+0

क्या आप कृपया एमवीएन निर्भरता का परिणाम पेस्ट कर सकते हैं: यहां पेड़? यह पुस्तकालयों का संघर्ष हो सकता है। –

+1

कृपया मेरा जवाब github.com/jadler-mocking/jadler/issues/107 में पढ़ें, समस्या जेटी संस्करणों (8 बनाम 9) के संघर्ष के कारण होती है। आप जेटी 9 निर्भरता को हटा सकते हैं (यदि परीक्षण चलाने के लिए इसकी आवश्यकता नहीं है) या जेटी निर्भरता के बिना जेडलर चलाएं (https://github.com/jadler-mocking/jadler/wiki/Using-the- वैकल्पिक-Stub- सर्वर - कार्यान्वयन) –

4

साथ ही आप JDK के HttpServer वर्ग के साथ एक नकली लिख सकते हैं (कोई बाहरी निर्भरता) की आवश्यकता। this blog post देखें कि कैसे।

सारांश में:

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8000), 0); 
httpServer.createContext("/api/endpoint", new HttpHandler() { 
    public void handle(HttpExchange exchange) throws IOException { 
     byte[] response = "{\"success\": true}".getBytes(); 
     exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length); 
     exchange.getResponseBody().write(response); 
     exchange.close(); 
    } 
}); 
httpServer.start(); 

try { 
// Do your work... 
} finally { 
    httpServer.stop(0); 
} 
+0

क्या यह कहने का कोई तरीका है कि 'HttpServer' को कोई अनुरोध प्राप्त हुआ है या नहीं? –

1

आप Apache httpclient का उपयोग कर रहे हैं, तो यह एक अच्छा विकल्प हो जाएगा। HttpClientMock

HttpClientMock httpClientMock = new httpClientMock() 
HttpClientMock("http://example.com:8080"); 
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}"); 

पूर्ण प्रकटीकरण: मैं पुस्तकालय के लेखक हूँ।

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