用于获取系统属性的模拟系统类

我通过 Eclipse 中的 JVM 参数在系统变量中设置了一个文件夹路径,并且我正在尝试在我的类中以:.System.getProperty("my_files_path")

在为这个类编写 junit 测试方法时,我尝试模拟这个调用,因为测试类不考虑 JVM 参数。我使用PowerMockito来模拟静态系统类,并尝试在调用时返回一些路径。System.getProperpty

在班级层面有和注释。但是,系统类没有被嘲笑,因此我总是得到空结果。任何帮助是值得赞赏的。@RunWith(PowerMockRunner.class)@PrepareForTest(System.class)


答案 1

谢谢萨蒂什。这有效,除非稍作修改。我编写了PrepForTest(PathFinder.class),为测试用例而不是System准备了我正在测试的类.class

另外,由于模拟只工作一次,我在模拟后立即调用了我的方法。我的代码仅供参考:

@RunWith(PowerMockRunner.class)
@PrepareForTest(PathInformation.class)
public class PathInformationTest {

    private PathFinder pathFinder = new PathFinder();

@Test
    public void testValidHTMLFilePath() { 
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.getProperty("my_files_path")).thenReturn("abc");
        assertEquals("abc",pathFinder.getHtmlFolderPath());
    }
}

答案 2

有些类 PowerMock 不能以通常的方式模拟。请参阅此处:

但是,这可能仍然不起作用。按照“好设计”偏好的顺序,你可以回退到这些:

  1. 重构您的代码!使用 System 属性来传递文件路径可能不是最佳方法。为什么不使用加载到属性对象中的属性文件?为什么不对需要知道此路径的组件使用 getters/setters?有很多更好的方法可以做到这一点。

    我能想到的这样做的唯一原因是你试图围绕你“不能”修改的代码包装一个测试工具。

  2. 使用 和 方法将系统属性设置为测试的某个已知值。您甚至可以将其作为方法本身的一部分。这将比试图通过PowerMock进行模拟要容易得多。只需致电@Before@After@TestSystem.setProperty("my_files_path","fake_path");


推荐