java代码测试环境变量_如何使⽤JUnit测试依赖于环境变量的
代码?
如何使⽤JUnit测试依赖于环境变量的代码?
我有⼀段使⽤环境变量的Java代码,代码的⾏为取决于此变量的值。 我想⽤环境变量的不同值测试此代码。 我怎么能在JUnit中这样做?我已经看到了⼀些在Java中设置环境变量的⽅法,但是我对它的单元测试⽅⾯更感兴趣,特别是考虑到测试不应该相互⼲扰。
11个解决⽅案
92 votes
库系统规则提供了⽤于设置环境变量的JUnit规则。
import ib.java.lang.system.EnvironmentVariables;
public void EnvironmentVariablesTest {
@Rule
public final EnvironmentVariables environmentVariables
= new EnvironmentVariables();
@Test
public void setEnvironmentVariable() {
environmentVariables.set("name", "value");
assertEquals("value", v("name"));
}
}
免责声明:我是系统规则的作者。
Stefan Birkner answered 2019-04-29T22:49:38Z
55 votes
通常的解决⽅案是创建⼀个管理对此环境变量的访问的类,然后可以在测试类中进⾏模拟。
public class Environment {
public String getVariable() {
v(); // or whatever
}
}
public class ServiceTest {
private static class MockEnvironment {
public String getVariable() {
return "foobar";
}
}
@Test public void testService() {
service.doSomething(new MockEnvironment());
}
}
然后,受测试的类使⽤Environment类获取环境变量,⽽不是直接从v()获取。
Matthew Farwell answered 2019-04-29T22:49:09Z
9 votes
在类似的情况下,我必须编写依赖于环境变量的测试⽤例,我尝试了以下⽅法:
我按照Stefan Birkner的建议去了系统规则。 它的使⽤很简单。 但不久之后,我发现这种⾏为不稳定。 在⼀次运⾏中,它可以⼯作,在下⼀次运⾏中它失败了。 我调查并发现系统规则适⽤于JUnit 4或更⾼版本。 但在我的情况下,我使⽤的是⼀些依赖于JUnit 3的Jars。所以我跳过了系统规则。 更多信息,你
可以在这⾥到@Rule注释在JUnit中使⽤TestSuite时不起作⽤。
接下来,我尝试通过Java提供的Process Builder类创建环境变量。 通过Java Code,我们可以创建⼀个环境变量,但是您需要知道我没有的过程或程序名称。 它还为⼦进程创建环境变量,⽽不是为主进程创建环境变量。
我使⽤上述两种⽅法浪费了⼀天,但⽆济于事。 然后Maven来救我。 我们可以通过Maven POM⽂件设置环境变量或系统属性,我认为这是基于Maven的项⽬进⾏单元测试的最佳⽅法。 下⾯是我在POM⽂件中输⼊的内容。
org.apache.maven.plugins
maven-surefire-plugin
PropertyValue1
PropertyValue2
EnvironmentVariableValue1
EnvironmentVariableValue2
在此更改之后,我再次运⾏测试⽤例,突然所有⼯作都按预期⼯作。 对于读者的信息,我在Maven 3.x中探索了这种⽅法,所以我对Maven 2.x⼀⽆所知。
RLD answered 2019-04-29T22:50:30Z
7 votes
将Java代码与Environment变量分离,从⽽提供⼀个更抽象的变量读取器,您可以使⽤EnvironmentVariableReader实现您的代码来测试读取。
然后在测试中,您可以为变量阅读器提供不同的实现,以提供您的测试值。
依赖注⼊可以帮助解决这个问题。
Andrea Colleoni answered 2019-04-29T22:51:06Z
6 votes
这个问题的答案如何从Java设置环境变量? 提供了⼀种在v()中更改(不可修改的)Map的⽅法。 因此,虽然它并没有真正改变OS环境变量的值,但它可以⽤于单元测试,因为它确实改变了v将返回的内容。
sudocode answered 2019-04-29T22:51:30Z
6 votes
我不认为这已被提及,但您也可以使⽤Powermockito:
鉴于:
package com.foo.service.impl;
public class FooServiceImpl {
public void doSomeFooStuff() {
// Do the other Foo stuff
}
}
您可以执⾏以下操作:
package com.foo.service.impl;
import kito.Mockito.when;
import static org.kStatic;
import static org.kito.PowerMockito.verifyStatic;
import org.junit.Beforea;
import org.junit.Test;
import org.junit.runner.RunWith;
kito.InjectMocks;
kito.MockitoAnnotations;
import lassloader.annotations.PrepareForTest;
import dules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(FooServiceImpl.class)
public class FooServiceImpTest {
@InjectMocks
private FooServiceImpl service;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mockStatic(System.class); // Powermock can mock static and private methods v("FOO_VAR_1")).thenReturn("test-foo-var-1");
v("FOO_VAR_2")).thenReturn("test-foo-var-2");
v("FOO_VAR_3")).thenReturn("test-foo-var-3");
}
@Test
public void testSomeFooStuff() {
// Test
service.doSomeFooStuff();
verifyStatic();
verifyStatic();
verifyStatic();
}
}
Mangusta answered 2019-04-29T22:51:57Z
3 votes
我认为最⼲净的⽅法是使⽤Mockito.spy()。 它⽐创建⼀个单独的类来模拟和传递更轻量级。将环境变量提取移动到另⼀个⽅法:
@VisibleForTesting
String getEnvironmentVariable(String envVar) {
v(envVar);
}
现在在您的单元测试中执⾏此操作:
@Test
public void test() {
ClassToTest classToTest = new ClassToTest();
ClassToTest classToTestSpy = Mockito.spy(classToTest);
Mockito.EnvironmentVariable("key")).thenReturn("value"); // Now test the method that uses getEnvironmentVariable
assertEquals("changedvalue", hodToTest());
}
pgkelley answered 2019-04-29T22:52:33Z
1 votes
希望问题得到解决。 我只是想告诉我的解决⽅案。
Map env = v();
new MockUp() {
@Mock
public String getenv(String name)
{
if (name.equalsIgnoreCase( "OUR_OWN_VARIABLE" )) {
return "true";
}
(name);
}
};variable怎么记
Muthu answered 2019-04-29T22:52:56Z
0 votes
那么你可以使⽤setup()⽅法来声明你的env的不同值。 常量中的变量。 然后在⽤于测试不同场景的测试⽅法中使⽤这些常量。
Cygnusx1 answered 2019-04-29T22:53:20Z
-1 votes
如果要在Java中检索有关环境变量的信息,可以调⽤⽅法:v();。作为属性,此⽅法返回⼀个Map,其中包含变量名称作为键,变量值作为映射值。 这是⼀个例⼦:
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map env = v();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, (envName));
}
}
}
⽅法getEnv()也可以采⽤参数。 例如 :
String myvalue = Env("MY_VARIABLE");
为了测试,我会做这样的事情:
public class Environment {
public static String getVariable(String variable) {
v(variable);
}
@Test
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论