2017-07-10 37 views
5

जब मैं इस परीक्षण चलाने नहीं पढ़ता (JMockit और TestNG का उपयोग कर, यकीन नहीं करता है, तो यह है कि प्रासंगिक है):मॉड्यूल java.base मॉड्यूल java.desktop

java.lang.IllegalAccessError: class java.lang.ProcessBuilder (in module java.base) cannot access class javax.print.PrintException (in module java.desktop) because module java.base does not read module java.desktop 

at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java) 
.... 
:

public class Test { 
    @Test public void test(@Mocked ProcessBuilder pb) throws IOException { 
    new Expectations() {{ pb.start(); result = null; }}; 
    assertNull(m()); 
    } 

    public static Process m() throws IOException { 
    return new ProcessBuilder("").start(); 
    } 
} 

मैं इस अपवाद

मैं बिल्ड 177 का उपयोग कर रहा हूं।

मैं --add-reads java.base=java.desktop तर्क का उपयोग करके परीक्षण को फिर से शुरू कर सकता हूं और यह ठीक काम करता है लेकिन मुझे वास्तव में यह नहीं समझ रहा है कि यहां क्या हो रहा है।

मुझे यह अपवाद क्यों मिल रहा है?

+3

मेरा अनुमान उन वर्गों के साथ कुछ बातचीत होगी जो पूर्ण रूप से लोड किए जा रहे हैं; 'PrintException'' IOException' का विस्तार करता है, और यह * लगता है * कुछ स्पष्ट रूप से स्विंग से संबंधित कुछ का उपयोग करते समय अस्पष्ट 'हेडलेस अपवाद' की तरह लगता है। मैं एक संभावित छिपे हुए वर्ग निर्भरता के बारे में एक बग दर्ज करने का सुझाव देता हूं। – chrylis

+0

क्या मॉड्यूलपाथ या क्लासपाथ पर कक्षाएं/जार हैं? क्या आपके कोड के लिए परिभाषित कोई मॉड्यूल हैं? –

+0

@ माइकलएस्टर क्लासपाथ पर - मैंने किसी मॉड्यूल को परिभाषित नहीं किया है। यह टेस्टएनजी और जेएमॉकिट और एक फ़ाइल (प्रश्न में टेस्ट क्लास) पर निर्भरता के साथ एक pom.xml के साथ एक साधारण परियोजना है। पोम में jmockit को चलाने की अनुमति देने के लिए निश्चित रूप से '-Djdk.attach.allowAttachSelf' की एक ArgLine शामिल है। – assylias

उत्तर

2

issue JMockit 1.34 के लिए तय किया गया है।

स्टार्टअप के दौरान, जेएमॉकिट जेआरई कक्षाओं के मज़ाक के लिए समर्थन प्रदान करने के लिए जेआरई कक्षा (कुछ फ़ील्ड जोड़कर) को संशोधित करता है। वास्तविक वर्ग जो संशोधित हो जाता है मनमाने ढंग से होता है, और javax.print.PrintException का उपयोग किया जाता था (द्वितीयक पसंद के रूप में) क्योंकि आमतौर पर इसे सामान्य परीक्षण चलाने में कभी लोड नहीं किया जाता है। जेडीके 9 पर, यह वर्ग "बेस" मॉड्यूल से उपलब्ध नहीं है, इसलिए इसे अब दूसरे स्थान पर बदल दिया गया है।

8

अवैध अवैध त्रुटि संकेत देता है कि jmockit ने java.desktop मॉड्यूल में अपवाद के संदर्भ में प्रोसेसबिल्डर (जावा.बेस में) का वाद्य किया है। मुझे नहीं पता कि यह अपवाद क्यों चुनता है, जो कि जेमॉकिट मेलिंग सूची के लिए कुछ हो सकता है। हालांकि यह समझाता है कि --add-reads समस्या को हल करता है।

+3

धन्यवाद - मैंने इस मुद्दे को उठाया है: https://github.com/jmockit/jmockit1/issues/428 – assylias

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