如何在Junit PowerMockito中使用System.GetEnv



我能够从junit嘲笑system.getEnv值,但是当我执行测试用例时 - 在我的服务类System.getEvn值中以null为单位。不知道我在这里做错了什么。请找到我的测试服务课和Junit课程。

可以帮助我解决此问题 - 为什么该值未在我的实际服务类中设置?

testservice.java

public class TestService {
    public TestService() throws Exception {
        loadTestMethod();
    }
    private void loadTestMethod() {
        System.out.println("Environment vairlable : " + System.getenv("my_key_name"));
        System.setProperty("app.key", System.getenv("my_key_name"));
    }
}

testserviceTest.java

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(value = { System.class })
@PowerMockIgnore("javax.management.*")
public class TestServiceTest {
    @Mock
    TestService testService;
    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.getenv("my_key_name")).thenReturn("Testing");
        System.out.println("Junit Environment vairlable : " + System.getenv("my_key_name"));
        testService = new TestService();
    }
    @Test
    public void myServiceTest() {
    }
}

仅仅因为PowerMockito允许我们模拟静态并不意味着我们应该。

您的课程取决于静态实施问题,在大多数情况下,使单位测试孤立。

考虑遵循Explicit Dependency Principle

方法和类应明确要求(通常是通过方法参数或构造函数参数(,以便正确地运行。

创建所需功能的抽象

public interface SystemWrapper {
    //The "standard" output stream
    PrintStream out;
    //Gets the value of the specified environment variable
    string getenv(string name);
    //Sets the system property indicated by the specified key.
    string setProperty(String key, String value);
}

实现将将实际调用封装到静态系统类

public class SystemWrapperImplementation implements SystemWrapper {
    //The "standard" output stream
    public final PrintStream out = System.out;
    //Gets the value of the specified environment variable
    public string getenv(string name) {
        return System.getenv(name);
    }
    //Sets the system property indicated by the specified key.
    public string setProperty(String key, String value) {
        return System.setProperty(key, value);
    }
}

然后,您的依赖类需要重构以包括抽象

public class TestService {
    private SystemWrapper system;
    public TestService(SystemWrapper system) throws Exception {
        this.system = system;
        string key = "app.key";
        string name = "my_key_name";
        loadTestMethod(key, name);
    }
    private void loadTestMethod(string key, string name) {
        string environmentVariable = system.getenv(name);
        system.out.println("Environment variable : " + environmentVariable);
        system.setProperty(key, environmentVariable);
    }
}

现在进行测试,您可以根据需要模拟必要的依赖项而不会产生任何不利影响。然后,在调用实际代码时,该实现将用于生产中。

最后,我建议不要让您的构造师抛出例外。构造函数应主要用于变量分配。

相关内容

  • 没有找到相关文章

最新更新