如何在JUnit中模拟“System.getenv(”...“)”。
目前我在做:
@RunWith(Parameterized.class)
@PowerMockRunnerDelegate(PowerMockRunner.class)
@PrepareForTest(System.class)
public class TestClass extends BaseTest {
public TestClass(String testCase) {
this.testCase = testCase;
}
@Before
@Override
public final void initTable() throws Throwable {
super.initTable();
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getenv("ENV_VAR1")).thenReturn("1234");
}
...
}
我正在使用PowerMock和Parameterizedrunner。
我在行下面的异常:
PowerMockito.when(System.getenv("ENV_VAR1")).thenReturn("1234");
例外:
org.mockito.exceptions.base.MockitoException:
'afterPropertiesSet' is a *void method* and it *cannot* be stubbed with a *return value*!
Voids are usually stubbed with Throwables:
doThrow(exception).when(mock).someVoidMethod();
***
答案 0 :(得分:2)
在测试用例的类级别使用@RunWith(PowerMockRunner.class)注释。 在测试用例的类级别使用@PrepareForTest({ClassThatCallsTheSystemClass.class})注释。
使用EasyMock的示例
public class SystemClassUser {
public String performEncode() throws UnsupportedEncodingException {
return URLEncoder.encode("string", "enc");
}
}
并测试
@RunWith(PowerMockRunner.class)
@PrepareForTest( { SystemClassUser.class })
public class SystemClassUserTest {
@Test
public void assertThatMockingOfNonFinalSystemClassesWorks() throws Exception {
mockStatic(URLEncoder.class);
expect(URLEncoder.encode("string", "enc")).andReturn("something");
replayAll();
assertEquals("something", new SystemClassUser().performEncode());
verifyAll();
}
}
自: https://github.com/powermock/powermock/wiki/MockSystem
因此,您应该添加一个使用System.getenv
而不是System
类到@PrepareForTest
的类。
这post解释了为什么要这样做。
另外,我建议您使用System Rules library 作为案例。它有stub environment variables的好方法。 PowerMock修改了一个类字节代码,因此它会慢慢进行测试。即使它不修改类,它至少从磁盘读取类。