如何确定方法调用是否源自Test Class

时间:2010-11-19 09:59:10

标签: java junit

...斐伊川 有没有办法找出方法调用是否来自测试类? 如果它来自测试类......那么我需要为类中的变量初始化一些虚拟值。我想编写测试类,源代码中的变化很小...... 该类遵循单例模式。因此调用其私有构造函数,调用一些阻止我的测试的代码。所以我需要在私有构造函数中从内部调用我的伪方法,以便它顺利运行..

目前我正在这样做......

StackTraceElement[] stack = new Throwable().getStackTrace();
boolean blnFrmTesting = false;
for (StackTraceElement stackTraceElement : stack) {
    if(null != stackTraceElement && null != stackTraceElement.getFileName() && stackTraceElement.getFileName().endsWith("Test.java")) {
        blnFrmTesting = true;
        break;
    }
}
return blnFrmTesting;

这是一个正确的方法......还是有其他办法......比如检查注释...(“@ Test”)

3 个答案:

答案 0 :(得分:3)

嗯,对于技术部分,我建议您应该尝试查看类名是否包含Test,instaead文件名,这是(尽管Java规范尝试将其规范化)总是有点更模糊(想想内部阶级,作为一个例子)。

然而,以更一般的方式,您的代码似乎忽略了大约十年的Java工程,忽略了测试框架(JUniot,TestNG)及其相关生态系统的存在。特别是,要定义“虚拟值”,模拟框架的领域是可行的方法。目前有很多有趣的选择:

显然,他们可能会干扰你的单身人士(或不会)。但是,我必须告诉你,在IoC框架的情况下,现在通常认为单例模式已被弃用。

答案 1 :(得分:3)

无论你是否找到这个问题的答案,最好不要首先执行此检查,并相应地构建你的代码......当通过测试调用时执行其他操作的代码真的经过考验,不是吗?

您还可以看一下使用DI模式和框架,如GuiceSpring ......这样可以使测试更容易,同时可能会导致代码更少,更简单。

答案 2 :(得分:0)

我普遍同意Sudhir,并不清楚Riduidel想要建议使用Mocking的内容。如果你想模拟班级的环境和社区,那么模拟很好。

我认为你的方法很好。如果添加@Test注释的检查以及该类扩展TestCase的事实,您可以真正改进它。如果您添加支持JUniot和testNG,您甚至可以发布您的代码,可能其他人可以使用它。

但我认为你可能甚至可以简化方法。为此,我使用了特殊的系统属性。通常我必须确定代码在应用程序服务器下运行,因此我使用了典型的应用程序服务器属性。例如JBoss的jboss.server.name和Tomcat的catalina.base。如果JUnit没有创建任何特殊属性,您可以在测试开始时自行完成并检入代码。