Ant 使用依赖于环境变量的代码进行单元测试
我们公开了一小组环境变量来控制我们的应用程序行为。应用程序代码是用java编写的。(环境变量可能是邪恶的,但在这种特殊情况下,环境变量是有目的的) 单元测试的最佳方法是什么?如何创建环境变量、将其设置为不同的值并重复调用测试 当前的解决方案是在junit任务中使用env元素。下面举个例子Ant 使用依赖于环境变量的代码进行单元测试,ant,junit,environment-variables,Ant,Junit,Environment Variables,我们公开了一小组环境变量来控制我们的应用程序行为。应用程序代码是用java编写的。(环境变量可能是邪恶的,但在这种特殊情况下,环境变量是有目的的) 单元测试的最佳方法是什么?如何创建环境变量、将其设置为不同的值并重复调用测试 当前的解决方案是在junit任务中使用env元素。下面举个例子 <env key="BASE_PLUGINS_FOLDER" value="c:/temp"/> 代码为测试设置环境变量。(这仅在fork mode设置为true时有效) 这意味着我必须在a
<env key="BASE_PLUGINS_FOLDER" value="c:/temp"/>
代码为测试设置环境变量。(这仅在fork mode设置为true时有效)
这意味着我必须在ant构建文件中创建多个测试部分,并在其他地方创建相应的测试部分。这可能很快变得难以管理
我觉得还有更好的方法,那就是完全使用JUnitJava代码。不知道如何回答。我担心这是一个无用的、令人沮丧的回答。。。但是考虑重新设计应用程序,允许重写环境变量。 所有对它们的访问都需要通过一个地方进行,这个地方还需要您选择配置机制-
-D、
或属性文件,
或由-D指向的属性文件,
或由测试设置传递的运行时创建的配置对象,
或烟雾信号,
或者…您应该封装如何检索这些变量。它不仅允许您更改传递它们的方式(env变量、系统属性、配置文件等),而且更易于测试
然后,您可以定义两种不同的实现:一种是实际读取环境(在生产中使用),另一种是您可以自己在Java中指定这些值(在测试中使用)。下面是我的朋友给出的一个技巧
Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
theEnvironmentField.setAccessible(true);
@SuppressWarnings({"unchecked"}) // this will be a Map or the test will fail if Java internals are changed
Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null);
env.put(name, val);
// now System.getenv will return what we want
//noinspection CallToSystemGetenv
assertEquals("Problems setting up environment variable for test: " + name, val, System.getenv(name));
Class ProcessEnvironment Class=Class.forName(“java.lang.ProcessEnvironment”);
字段theenvironment字段=processEnvironmentClass.getDeclaredField(“theCaseInsensitiveEnvironment”);
环境字段。设置为可访问(true);
@SuppressWarnings({“unchecked”})//这将是一个映射,或者如果Java内部结构发生更改,测试将失败
Map env=(Map)环境字段.get(null);
环境投入(名称、价值);
//现在System.getenv将返回我们想要的内容
//无检查调用系统GetEnv
assertEquals(“为测试设置环境变量时出现问题:+name,val,System.getenv(name));
这可以通过使用JUnit4和JUnit5中的系统存根()来解决:
JUnit4:
@规则
public EnvironmentVariablesRule env=new EnvironmentVariablesRule(“基本插件”文件夹“,“/tmp/something”);
@试验
公开无效测试(){
//变量设置在这里
}
或者在JUnit5中:
@ExtendWith(SystemStubsExtension.class)
类测试{
@系统存根
private EnvironmentVariables env=new EnvironmentVariables(“BASE_PLUGINS_FOLDER”,“/tmp/something”);
@试验
void envSetHere(){
//已设置环境变量
}
}
我会避免依赖操作系统环境变量。您不能使用Java系统属性吗。您可以通过编程方式设置它们(例如在JUnit init中)或在启动应用程序时传递它们(java.lang.System.getProperty()
)。