java – 单元测试如何在不在应用程序服务器中运行时设置数据源?

感谢大家的帮助.你发布了一些(我应该预料到的)答案,表明我的整个方法都是错误的,或者低级代码永远不必知道它是否在容器中运行.我倾向于同意.但是,我正在处理一个复杂的遗留应用程序,并且没有选择对当前问题进行重大重构.

让我退后一步,问问题是我原来问题的动机.

我有一个在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.

解决方法

整个方法感觉错了,向我走来.如果您的应用需要知道它正在运行哪个容器,那么您做错了什么.

当我使用Spring时,我可以从Tomcat迁移到WebLogic并返回而不会改变任何内容.我确信通过适当的配置,我也可以用JBOSS做同样的技巧.这就是我要拍的目标.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量