Lựa chọn A) Sử dụng ServletContext.getResourceXXX()
Bạn nên có một MockHttpSession Aquillarian và MockServletContext. Ví dụ:
@Test
public void myTest()
{
HttpSession session = new MockHttpSession(new MockServletContext());
ServletLifecycle.beginSession(session);
..testCode..
// You can obtain a ServletContext (will actually be a MockServletContext
// implementation):
ServletContext sc = session.getServletContext();
URL url = ServletContext.getResource("/WEB-INF/testdata.xml")
Path resPath = new Path(url);
File resFile = new File(url);
FileReader resRdr = new FileReader(resFile);
etc...
..testCode..
ServletLifecycle.endSession(session);
}
Bạn có thể tạo các file tài nguyên & thư mục con trong:
- module gốc tài liệu web - nguồn lực có thể truy cập từ trình duyệt và từ lớp
- WEB-INF/classes/- nguồn lực có thể truy cập vào các lớp học
- WEB-INF/lib/*. jar nguồn jar - có thể truy cập vào các lớp học
- WEB-INF/lib/*. jar jar chỉ dành riêng cho tài nguyên - có thể truy cập vào classe s
- WEB-INF/trực tiếp trong thư mục - có thể truy cập vào các lớp. Đây là những gì bạn đang yêu cầu.
Trong mọi trường hợp tài nguyên có thể được truy cập thông qua:
URL url = sc.getResource("/<path from web doc root>/<resourceFileName>");
OR
InputStream resIS = sc.getResourceAsStream("/<path from web doc root>/<resourceFileName>");
>
Những điều này sẽ được đóng gói vào tập tin WAR và có thể bùng nổ vào thư mục trên máy chủ ứng dụng được triển khai hoặc họ có thể ở trong tệp WAR trên máy chủ ứng dụng. Dù bằng cách nào - cùng một hành vi để truy cập tài nguyên: sử dụng ServletContext.getResourceXXX().
Lưu ý rằng theo nguyên tắc chung, (5) thư mục WEB-INF cấp cao nhất được dự định để sử dụng bởi máy chủ.Đó là 'lịch sự' không đặt tài nguyên web của bạn trực tiếp tại đây hoặc tạo thư mục của riêng bạn trực tiếp tại đây. Thay vào đó, tốt hơn để sử dụng (2) ở trên.
JEE5 tutorial web modules JEE6 tutorial web modules
Lựa chọn B): Sử dụng Class.getResourceXXX()
Đầu tiên di chuyển các nguồn lực ra khỏi thư mục WEB-INF vào WEB-INF/classes (hoặc bên trong một lọ WEB- INF/lib/*. Jar).
Nếu lớp thử nghiệm của bạn là:
- com.abc.pkg.test.MyTest trong file WEB-INF/classes/com/abc/pkg/test/MyTest.class
và tập tin tài nguyên của bạn là
- WEB-INF/classes/com/abc/pkg/test/nguồn/testdata.xml (hoặc tương đương trong một file jar)
truy cập tập tin sử dụng tương đối File Location, thông qua Java ClassLoader - tìm thấy thư mục/Chum so với Classpath:
java.net.URL resFileURL = MyTest.class.getResource("resources/testdata.xml");
File resFile = new File(fileURL);
OR
InputStream resFileIS =
MyTedy.class.getResourceAsStream("resources/testdata.xml");
truy cập tập tin Sử dụng đầy đủ trọn gói giống như Trình độ chuyên môn, Sử dụng Java ClassLoader - tìm thấy thư mục/Chum so với Classpath :
java.net.URL resFileURL = MyTest.class.getResource("/com/abc/pkg/test/resources/testdata.xml");
File resFile = new File(fileURL);
OR
InputStream resFileIS =
MyTest.class.getResourceAsStream("/com/abc/pkg/test/resources/testdata.xml");
OR
java.net.URL resFileURL = MyTest.class.getClassLoader().getResource("com/abc/pkg/test/resources/testdata.xml");
File resFile = new File(fileURL);
OR
InputStream resFileIS =
MyTest.class.getClassLoader().getResourceAsStream("com/abc/pkg/test/resources/testdata.xml");
Mong rằng móng tay! @B)
Nó phải ở trong classpath để làm 'Class.getResourseAsStream()'. Không phải mọi thứ bên trong WEB-INF đều được đặt trong classpath. Chỉ nội dung của thư mục lớp trong WEB-INF mới được thêm vào đường dẫn lớp. Bạn có thể nhận được đường dẫn của đường dẫn ngữ cảnh và nối nó với phần còn lại của vị trí. –
Hoặc nếu bạn có quyền truy cập vào 'ServletContext', bạn có thể thực hiện' servletContext.getRealPath ("/ WEB-INF/testdata.xml") '. –
@BheshGurung Nhưng điều đó không thành công. – LuckyLuke