Спасибо всем за помощь. Некоторые из вас опубликовали (как я и ожидал) ответы, указывающие, что весь мой подход был неверным или что низкоуровневый код никогда не должен знать, запущен ли он в контейнере. Я хотел бы согласиться. Однако я имею дело со сложным унаследованным приложением, и у меня нет возможности провести серьезный рефакторинг для текущей проблемы.
Позвольте мне сделать шаг назад и задать вопрос, мотивированный моим первоначальным вопросом.
У меня есть устаревшее приложение, работающее под JBoss, и я внес некоторые изменения в код более низкого уровня. Я создал юнит-тест для моей модификации. Для запуска теста мне нужно подключиться к базе данных.
Унаследованный код получает источник данных следующим образом:
(jndiName - определенная строка)
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(jndiName);
Моя проблема в том, что когда я запускаю этот код в модульном тесте, в контексте не определяются источники данных. Мое решение этого состояло в том, чтобы попытаться увидеть, работаю ли я под сервером приложений, и, если нет, создать тестовый источник данных и вернуть его. Если я работаю на сервере приложений, я использую приведенный выше код.
Итак, мой реальный вопрос: как правильно это сделать? Есть ли какой-то одобренный способ, которым модульный тест может настроить контекст для возврата соответствующего источника данных, чтобы тестируемый код не нуждался в информации о том, где он работает?
Для контекста: МОЙ ОРИГИНАЛЬНЫЙ ВОПРОС:
У меня есть некоторый Java-код, который должен знать, работает ли он под JBoss. Есть ли канонический способ для кода определить, выполняется ли он в контейнере?
Мой первый подход был разработан на основе эксперимента и состоит из получения исходного контекста и проверки того, что он может искать определенные значения.
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)
{
.........
Теперь, похоже, это работает, но похоже на взлом. Каков «правильный» способ сделать это? В идеале мне бы хотелось, чтобы такой способ работал с различными серверами приложений, а не только с JBoss.