0 जूनी के साथ मल्टीथ्रेडेड जावा एप्लिकेशन का परीक्षण करते समय उपयोगकर्ता कंसोल इनपुट का अनुकरण करते समय दिलचस्प व्यवहार

पर बनाया गया सवाल Thu, Mar 28, 2019 12:00 AM

मैं जावा में JUnit का उपयोग करके एक स्वचालित असाइनमेंट ग्रेडिंग स्क्रिप्ट विकसित करने का प्रयास कर रहा हूं। मैं System.in को ByteArrayInputStream के बाइट्स में स्ट्रिंग डेटा वाले बाइट में बदलकर उपयोगकर्ता इनपुट का परीक्षण कर रहा हूं। मैं सभी मामलों की जांच के लिए कई परीक्षण मामलों को चलाने में सक्षम होना चाहता हूं और फिर असाइनमेंट सबमिशन को चिह्नित करने के लिए ग्रैडेल-निर्मित रिपोर्ट का उपयोग कर सकता हूं।

वर्तमान में, मैं इस लिंक का उपयोग करके परीक्षण मामलों द्वारा प्रदान किए गए इनपुट को प्रतिबिंबित करने के लिए उपयोगकर्ता इनपुट का अनुकरण करने में सक्षम हूं: JUnit: System.in परीक्षण का अनुकरण कैसे करें? । मैं असाइनमेंट से मुद्रित स्टेटमेंट्स को कैप्चर करने के लिए System.out को PrintStream में भी बदल रहा हूं। मेरा मुख्य तरीका एक नया धागा पैदा करता है, जिसके अंदर असाइनमेंट के कोड होते हैं, जैसा कि नीचे दिखाया गया है।

इकाई परीक्षण सफलतापूर्वक निष्पादित होता है जब मैं प्रत्येक @ टेस्ट - एनोटेट केस का व्यक्तिगत रूप से परीक्षण कर रहा हूं। हालाँकि, जब मैं एक एकल परीक्षण वर्ग में निहित सभी परीक्षण चलाता हूं, तो JUnit पहले @Test -annotated मामले में सफलतापूर्वक काम करता है, लेकिन अंतिम वाले पर विफल रहता है, जो यहां कुछ अप्रत्याशित है। उम्मीद है कि नीचे दिए गए कोड स्थिति को स्पष्ट करने में मदद करेंगे।

मेरी मुख्य विधि :

public static void main(String ... args) {
    Assignment assignment = new Assignment();
    new Thread(assignment).start();
}

मेरे परीक्षण वर्ग में कुछ @before और @a annotated विधियाँ हैं:

@Before
public void setup() {
    systemIn = System.in; // global variable
    systemOut = System.out; // global variable
    output = new ByteArrayOutputStream(); // global variable
    System.setOut(new PrintStream(output));
    assignment = new Assignment();
}
@After
public void conclude() {
    System.setIn(systemIn);
    System.setOut(systemOut);
}

मैं प्रत्येक परीक्षण केस इनपुट और आउटपुट के लिए संबंधित फ़ाइल पढ़ रहा हूं, और नीचे दिए गए फ़ंक्शन में, मैं टेस्ट केस इनपुट सेट कर रहा हूं।

private void setInput(String data) {
    ByteArrayInputStream input = new ByteArrayInputStream(data.getBytes());
    System.setIn(input);
}

मैं प्रत्येक परीक्षण मामले को निम्न प्रकार से चला रहा हूं:

@org.junit.Test // 2,3,4 ....for other cases
public void runTestCase1() { 
    testCases(1);
}

IO वर्ग जो असाइनमेंट का उपयोग कर रहा है, वह इस प्रकार है:

public static String readLine() { // w/o try/catch blocks
    String read = reader.readLine(); // reader -> bufferedReader(new InputStream(System.in))
    return read.trim();
}

यह भी ध्यान दें कि मैं मुख्य विधि को लागू करने से पहले Thread.sleep(50) का उपयोग कर रहा हूं ताकि इनपुट टेस्ट केस सफलतापूर्वक पढ़ा जा सके और असाइनमेंट के निष्पादन के लिए समय में System.in में लोड हो जाए।

सभी परीक्षणों को एक साथ चलाने पर, पहला परीक्षण सही आउटपुट देता है, यानी अपेक्षित और वास्तविक आउटपुट मैच करता है। हालांकि, दूसरे मामले और आगे के लिए, IO.readline() एक नल सूचक अपवाद उत्पन्न करता है और इसलिए असाइनमेंट द्वारा कोई आउटपुट नहीं उत्पन्न होता है। जांच करने पर, मुझे पता चला कि दूसरे मामले के दौरान, System.in अब एक बाइटअरेइंटरप्यूटस्ट्रीम की ओर इशारा नहीं कर रहा है, बल्कि (पुराना?) बफ़रडइनप्यूटस्ट्रीम है। मैं असमंजस में हूँ कि ऐसा क्यों हो रहा है (शायद किसी नए सूत्र के कारण शायद?) और मैं इस समस्या को कैसे दूर करूं? //>     

1
0 उत्तर                              0                         
स्रोत रखा गया यहाँ