Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant 使用依赖于环境变量的代码进行单元测试_Ant_Junit_Environment Variables - Fatal编程技术网

Ant 使用依赖于环境变量的代码进行单元测试

Ant 使用依赖于环境变量的代码进行单元测试,ant,junit,environment-variables,Ant,Junit,Environment Variables,我们公开了一小组环境变量来控制我们的应用程序行为。应用程序代码是用java编写的。(环境变量可能是邪恶的,但在这种特殊情况下,环境变量是有目的的) 单元测试的最佳方法是什么?如何创建环境变量、将其设置为不同的值并重复调用测试 当前的解决方案是在junit任务中使用env元素。下面举个例子 <env key="BASE_PLUGINS_FOLDER" value="c:/temp"/> 代码为测试设置环境变量。(这仅在fork mode设置为true时有效) 这意味着我必须在a

我们公开了一小组环境变量来控制我们的应用程序行为。应用程序代码是用java编写的。(环境变量可能是邪恶的,但在这种特殊情况下,环境变量是有目的的)

单元测试的最佳方法是什么?如何创建环境变量、将其设置为不同的值并重复调用测试

当前的解决方案是在junit任务中使用env元素。下面举个例子

 <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()
)。