2017-07-10 37 views
5

Khi tôi chạy thử nghiệm này (sử dụng jmockit và TestNG, không chắc chắn nếu có liên quan):mô-đun java.base không đọc mô-đun java.desktop

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(); 
    } 
} 

tôi nhận được ngoại lệ này:

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) 
.... 

Tôi đang sử dụng build 177.

Tôi có thể chạy lại thử nghiệm bằng cách sử dụng đối số --add-reads java.base=java.desktop và nó hoạt động tốt nhưng tôi không thực sự hiểu những gì đang xảy ra ở đây.

Tại sao tôi nhận được ngoại lệ đó?

+3

Dự đoán của tôi sẽ là một số tương tác với các lớp đang được tải ngầm; 'PrintException' không mở rộng' IOException', và điều này * cảm thấy * giống như 'HeadlessException' không thể giải thích được khi sử dụng cái gì đó không rõ ràng liên quan đến Swing. Tôi đề nghị nộp một lỗi về sự phụ thuộc vào lớp ẩn. – chrylis

+0

Các lớp/lọ trên đường dẫn mô-đun hay đường dẫn lớp? Có bất kỳ mô-đun nào được xác định cho mã của bạn không? –

+0

@MichaelEaster trên đường dẫn lớp - Tôi chưa xác định bất kỳ mô-đun nào. Đó là một dự án đơn giản với một tệp pom.xml với sự phụ thuộc vào TestNG và jmockit và một tệp (lớp Test trong câu hỏi). Các pom bao gồm một argLine của '-Djdk.attach.allowAttachSelf' cho chắc chắn để cho phép jmockit để chạy. – assylias

Trả lời

2

issue đã được sửa cho JMockit 1.34.

Trong khi khởi động, JMockit sửa đổi một lớp JRE (thêm một vài trường) để cung cấp hỗ trợ cho việc mô phỏng các lớp JRE. Lớp thực tế được sửa đổi là tùy ý, và javax.print.PrintException đã được sử dụng (như là một lựa chọn thứ cấp) chỉ vì nó thường không bao giờ được tải trong một thử nghiệm điển hình. Trên JDK 9, lớp này không thể truy cập từ mô-đun "cơ sở", vì vậy nó bây giờ đã được thay thế bởi một mô-đun khác.

8

The IllegalAccessError gợi ý rằng JMockit có công cụ ProcessBuilder (trong java.base) có tham chiếu đến một ngoại lệ trong mô-đun java.desktop. Tôi không biết tại sao nó chọn ngoại lệ này, đó có thể là một cái gì đó cho danh sách gửi thư của JMockit. Tuy nhiên, nó giải thích lý do tại sao --add-reads khắc phục sự cố.

+3

Cảm ơn - Tôi đã nêu ra vấn đề ở đó: https://github.com/jmockit/jmockit1/issues/428 – assylias

Các vấn đề liên quan