在jmockit单元测试中设置系统属性

问题描述 投票:0回答:2

结合使用testng和jmockit来做一些单元测试。在我正在测试的方法中,它尝试访问我使用 JBoss 部署脚本设置的系统属性,因此我的单元测试无法访问整个 JBoss 环境来访问这些属性,因此在测试该方法时它返回 null 。尝试直接在测试中模拟和设置系统变量,但系统属性仍然在我正在测试的类中返回 null。

正在测试的班级:

//returns the correct value in the application but returns null for the test
public static final String webdavrootDir = System.getProperty("property.name");

public String getFileUrl(){
       StringBuilder sb = new StringBuilder();
       return sb.append(webdavrootDir)
               .append(intervalDir)
               .append(fileName)
               .toString();
}

测试:

@Test
    public void getUrl(@Mocked System system){
        system.setProperty("property.name", "https://justatest.com/dav/bulk");
        String fileUrl = csvConfig.getFileUrl();

        assertEquals(fileUrl, "https://justatest.com/dav/bulk/otherstuff");
}

测试找到值

null/otherstuff
但期望
https://justatest.com/dav/bulk/otherstuff

我还尝试在 testng

@BeforeMethod
方法中设置系统属性,但没有成功。

java unit-testing testng jmockit system-properties
2个回答
4
投票

确保在实例化被测试的类之前调用

System.setProperty("property.name", "https://justatest.com/dav/bulk");
,否则静态字段将始终为空。

考虑使用

@BeforeClass
设置方法:

@BeforeClass
public static void setup() {
    System.setProperty("property.name", "https://justatest.com/dav/bulk");
    // Instantiate your CsvConfig instance here if applicable.
}

然后

@Test
public void getUrl(){
    System.setProperty("property.name", "https://justatest.com/dav/bulk");
    String fileUrl = csvConfig.getFileUrl();
    assertEquals(fileUrl, "https://justatest.com/dav/bulk/otherstuff");
}

1
投票

如果你想使用jMockit,那么你需要确保在加载你的被测类之前完成它(因为静态字段)。

@BeforeClass
public static void fakeSystemProperty() {
    new MockUp<System>() {

        @Mock
        public String getProperty(String key) {
            return "https://justatest.com/dav/bulk";
        }
    };
}

另一种方法是修改被测类并部分模拟这个类,例如:

public class CsvConfig {
    private static final String webdavrootDir = System.getProperty("property.name");
    
    public static String getProperty() {
        return webdavrootDir;
    }
}

测试:

@BeforeClass
public static void fakeSystemProperty() {
    new MockUp<CsvConfig>() {

        @Mock
        public String getProperty() {
            return "https://justatest.com/dav/bulk";
        }
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.