चलो कहते हैं कि मैं एक बाकी सेवा ए बदले में यह सेवा एक और बाकी सेवा बी हिट और यूआरआई बाकी पर हिट करने के लिए की एक सूची हो जाता है के लिए वसंत एकीकरण परीक्षणों लिख रहा हूँ चलो निपटने सेवा सी। यह एक तरह का ऑटो-खोज पैटर्न है। मैं MockRestServiceServer का उपयोग कर बी और सी प्रतिक्रियाओं का नकल करना चाहता हूं।
अब बी से प्रतिक्रिया यूआरआई की एक सूची है, वे सब बहुत समान हैं, और उदाहरण के लिए मान लीजिए कि बी से मेरी प्रतिक्रिया इतनी तरह है:स्प्रिंग MockRestServiceServer उसी URI (स्वत: खोज) के लिए एक से अधिक अनुरोध
{
uris: ["/stuff/1.json", "/stuff/2.json", "/stuff/39.json", "/stuff/47.json"]
}
बस सेवा के एक से प्रत्येक में संलग्न कर देगा उन्हें सेवा सी के लिए आधार यूआरएल पर और उन अनुरोधों को बनाते हैं।
मॉकिंग बी आसान है क्योंकि यह केवल 1 अनुरोध है।
मजाक सी एक परेशानी के रूप में मैं नकली प्रतिक्रिया उचित हर एक यूआरआई नकली करने के लिए होता है। मैं इसे स्वचालित करना चाहता हूँ!
तो सबसे पहले मैं लिखने के अपने खुद के मेल खाने वाला एक पूर्ण URL नहीं मैच के लिए, लेकिन यह का हिस्सा:
public class RequestContainsUriMatcher implements RequestMatcher {
private final String uri;
public RequestContainsUriMatcher(String uri){
this.uri = uri;
}
@Override
public void match(ClientHttpRequest clientHttpRequest) throws IOException, AssertionError {
assertTrue(clientHttpRequest.getURI().contains(uri));
}
}
यह ठीक काम करता है के रूप में अब मैं यह कर सकता:
public RequestMatcher requestContainsUri(String uri) {
return new RequestContainsUriMatcher(uri);
}
MockRestServiceServer.createServer(restTemplate)
.expect(requestContainsUri("/stuff"))
.andExpect(method(HttpMethod.GET))
.andRespond(/* I will get to response creator */);
अब सभी की आवश्यकता है एक प्रतिक्रिया निर्माता है कि पूरा अनुरोध URL जानता है और जहां नकली डेटा बैठता है (मैं इसे परीक्षण संसाधन फ़ोल्डर में json फ़ाइलों के रूप में होगा):
public class AutoDiscoveryCannedDataResponseCreator implements ResponseCreator {
private final Function<String, String> cannedDataBuilder;
public AutoDiscoveryCannedDataResponseCreator(Function<String, String> cannedDataBuilder) {
this.cannedDataBuilder = cannedDataBuilder;
}
@Override
public ClientHttpResponse createResponse(ClientHttpRequest clientHttpRequest) throws IOException {
return withSuccess(cannedDataBuilder.apply(requestUri), MediaType.APPLICATION_JSON)
.createResponse(clientHttpRequest);
}
}
अब सामान के लिए आसान है, मैं हवलदार ई एक निर्माता को लिखने के लिए जो एक स्ट्रिंग के रूप में यूआरआई अनुरोध करता है और एक स्ट्रिंग के रूप में नकली डेटा देता है! प्रतिभाशाली!
public ResponseCreator withAutoDetectedCannedData() {
Function<String, String> cannedDataBuilder = new Function<String, String>() {
@Override
public String apply(String requestUri) {
//logic to get the canned data based on URI
return cannedData;
}
};
return new AutoDiscoveryCannedDataResponseCreator(cannedDataBuilder);
}
MockRestServiceServer.createServer(restTemplate)
.expect(requestContainsUri("/stuff"))
.andExpect(method(HttpMethod.GET))
.andRespond(withAutoDetectedCannedData());
यह ठीक काम करता है! .... पहले अनुरोध के लिए।
पहले अनुरोध (/stuff/1.json) मेरी MockRestServiceServer संदेश के साथ प्रतिक्रिया के बाद "अभिकथन त्रुटि: आगे कोई उम्मीद अनुरोध"।
मूल रूप से, मुझे लगता है कि MockRestServiceServer के रूप में कई अनुरोधों के रूप में वहाँ .expect थे बना सकते हैं() उस पर कॉल करता है। और चूंकि मेरे पास उनमें से केवल 1 था, केवल पहला अनुरोध ही होगा।
क्या इसके आसपास कोई रास्ता है? मैं वास्तव में सेवा सी 10 या 20 बार ...
RequestContainsUriMatcher कार्यान्वयन – Silentbang