感谢大家的帮助.你发布了一些(我应该预料到的)答案,表明我的整个方法都是错误的,或者低级代码永远不必知道它是否在容器中运行.我倾向于同意.但是,我正在处理一个复杂的遗留应用程序,并且没有选择对当前问题进行重大重构.
让我退后一步,问问题是我原来问题的动机.
我有一个在JBoss下运行的遗留应用程序,并对低级代码进行了一些修改.我为我的修改创建了一个单元测试.为了运行测试,我需要连接到数据库.
(jndiName是一个已定义的字符串)
Context ctx = new InitialContext(); DataSource dataSource = (DataSource) ctx.lookup(jndiName);
我的问题是,当我在单元测试下运行此代码时,Context没有定义数据源.我的解决方案是尝试查看我是否在应用程序服务器下运行,如果没有,则创建测试DataSource并返回它.如果我在app服务器下运行,那么我使用上面的代码.
所以,我真正的问题是:这样做的正确方法是什么?是否有一些批准的方式单元测试可以设置上下文以返回适当的数据源,以便被测代码不需要知道它在哪里运行?
对于上下文:我的原始问题:
我有一些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.