Cảm ơn tất cả vì sự giúp đỡ của bạn. Một số câu trả lời bạn đăng tải (như tôi lẽ ra phải đợi) cho thấy toàn bộ cách tiếp cận của tôi là sai, hoặc mã cấp thấp đó không bao giờ phải biết nó có đang chạy trong vùng chứa hay không. Tôi định đông y. Tuy nhiên, tôi đang đối phó với một ứng dụng kế thừa phức tạp và không có tùy chọn thực hiện tái cấu trúc chính cho vấn đề hiện tại.Các bài kiểm tra đơn vị nên thiết lập nguồn dữ liệu khi không chạy trong máy chủ ứng dụng như thế nào?
Hãy để tôi quay lại và đặt câu hỏi là câu hỏi ban đầu có động cơ của tôi.
Tôi có một ứng dụng cũ chạy dưới JBoss và đã thực hiện một số sửa đổi đối với mã cấp thấp hơn. Tôi đã tạo ra một bài kiểm tra đơn vị để sửa đổi của tôi. Để chạy thử nghiệm, tôi cần kết nối với cơ sở dữ liệu.
Mã di sản được nguồn dữ liệu theo cách này:
(jndiName là một chuỗi định nghĩa)
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(jndiName);
Vấn đề của tôi là khi tôi chạy mã này dưới sự kiểm tra đơn vị, bối cảnh không có dữ liệu nguồn được xác định. Giải pháp của tôi cho điều này là cố gắng xem liệu tôi có đang chạy dưới máy chủ ứng dụng hay không và nếu không, hãy tạo DataSource thử nghiệm và trả về nó. Nếu tôi đang chạy dưới máy chủ ứng dụng thì tôi sử dụng mã ở trên.
Vì vậy, câu hỏi thực sự của chúng tôi là: Cách chính xác để thực hiện việc này là gì? Có cách nào được phê duyệt kiểm tra đơn vị có thể thiết lập ngữ cảnh để trả về nguồn dữ liệu thích hợp để mã đang được kiểm tra không cần phải biết nơi nó đang chạy không?
Đối Bối cảnh: MY ORIGINAL HỎI:
Tôi có một số mã Java mà cần phải biết hay không nó đang chạy dưới JBoss. Có một cách kinh điển cho mã để cho biết liệu nó đang chạy trong một container?
Cách tiếp cận đầu tiên của tôi được phát triển thông qua thử nghiệm và bao gồm nhận bối cảnh ban đầu và thử nghiệm để có thể tra cứu các giá trị nhất định.
private boolean isRunningUnderJBoss(Context ctx) {
boolean runningUnderJBoss = false;
try {
// The following invokes a naming exception when not running under
// JBoss.
ctx.getNameInNamespace();
// The URL packages must contain the string "jboss".
String urlPackages = (String) ctx.lookup("java.naming.factory.url.pkgs");
if ((urlPackages != null) && (urlPackages.toUpperCase().contains("JBOSS"))) {
runningUnderJBoss = true;
}
} catch (Exception e) {
// If we get there, we are not under JBoss
runningUnderJBoss = false;
}
return runningUnderJBoss;
}
Context ctx = new InitialContext();
if (isRunningUnderJboss(ctx)
{
.........
Hiện tại, điều này có vẻ hiệu quả nhưng cảm giác như bị hack. Cách chính xác để làm điều này là gì? Lý tưởng nhất, tôi muốn một cách mà sẽ làm việc với một loạt các máy chủ ứng dụng, không chỉ JBoss.
Tôi cho rằng, thay vì JBoss, bạn có nghĩa là Tomcat? (Được nhúng trong JBoss.) – Eddie
Bạn đang cố xác định vùng chứa so với không chứa hoặc loại vùng chứa ứng dụng đang chạy? – Kapsh
Bạn có thể mở rộng về lý do tại sao bạn cần biết liệu nó có đang chạy trong vùng chứa không? Điều đó có thể giúp trực tiếp câu trả lời. –