如何在JUnit中模拟System.getenv()[Powermock + Parameterized]

时间:2017-06-09 06:34:37

标签: mockito junit4 spring-test powermockito

如何在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();
***

1 个答案:

答案 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修改了一个类字节代码,因此它会慢慢进行测试。即使它不修改类,它至少从磁盘读取类。