BufferedReader.readLine()
के साथ समस्या यह है कि यह एक अवरोधक विधि है जो उपयोगकर्ता इनपुट के लिए इंतजार कर रही है।ऐसा लगता है कि आप विशेष रूप से अनुकरण करना नहीं चाहते हैं (यानी आप परीक्षण तेजी से करना चाहते हैं)। लेकिन एक परीक्षण संदर्भ में यह परीक्षण के दौरान उच्च गति पर लगातार null
लौटाता है, जो अजीब है।
शुद्धिकरण के लिए आप पैकेज-प्राइवेट के नीचे getInputLine
बना सकते हैं और इसे मजाक कर सकते हैं: आसान-peezy।
String getInputLine() throws Exception {
return br.readLine();
}
... आपको यह सुनिश्चित करना होगा कि आपके पास ऐप के साथ उपयोगकर्ता इंटरैक्शन का एक लूप (आमतौर पर) रोकना है। आपको इस तथ्य का सामना करना पड़ेगा कि आपकी "इनपुट लाइन" हमेशा एक जैसी होगी जब तक कि आपने किसी भी तरह से अपने नकली doReturn
को परिवर्तित नहीं किया: उपयोगकर्ता इनपुट की शायद ही सामान्य है।
एक गैर शुद्धतावादी जो खुद के लिए जीवन को आसान बनाने के (और पठनीय परीक्षण उत्पादन) के लिए आपको अपने ऐप्लिकेशन कोड में नीचे यह सब सामान डाल सकता है चाहता है के लिए:
private Deque<String> inputLinesDeque;
void setInputLines(List<String> inputLines) {
inputLinesDeque = new ArrayDeque<String>(inputLines);
}
private String getInputLine() throws Exception {
if (inputLinesDeque == null) {
// ... i.e. normal case, during app run: this is then a blocking method
return br.readLine();
}
String nextLine = null;
try {
nextLine = inputLinesDeque.pop();
} catch (NoSuchElementException e) {
// when the Deque runs dry the line returned is a "poison pill",
// signalling to the caller method that the input is finished
return "q";
}
return nextLine;
}
... अपने परीक्षण में आप हो सकता है तो इस तरह जाएं:
consoleHandler.setInputLines(Arrays.asList(new String[]{ "first input line", "second input line" }));
इस "कंसोलहैंडलर" वर्ग में विधि को ट्रिगर करने से पहले इनपुट लाइनों की आवश्यकता है।
स्रोत
2017-01-22 18:55:18
एक TDD दृष्टिकोण से, इस डिजाइन कि परीक्षण "ड्राइविंग" या इंगित करने के लिए प्रयास कर रहा है बचा जाता है। हालांकि, ओपी ने टीडीडी निर्दिष्ट नहीं किया है, और एक टेस्ट-बाद परिप्रेक्ष्य से, यह करना बहुत ही उचित बात है - सिस्टम को वैश्विक स्तर पर लाभ उठाएं। – Yishai
आप System.in = xxx नहीं कर सकते क्योंकि System.in अंतिम है। आप System.setIn का उपयोग कर सकते हैं, लेकिन सुनिश्चित करें कि आप आंसू में डिफ़ॉल्ट पर वापस आते हैं। इसके अलावा आपको अपने स्वयं के इनपुटस्ट्रीम को रोल करने की आवश्यकता नहीं है, बाइटएरेइन इनपुटस्ट्रीम अच्छी तरह से काम करेगा। –
ओह हाँ, मैं उलझन में आया। मैंने जो कहने की कोशिश की थी ... अच्छी तरह से मैं अपनी प्रविष्टि संपादित करूँगा :) – OscarRyz