在 jmockit 单元测试中设置系统 属性
Set system property in jmockit unit test
结合使用 testng 和 jmockit 进行一些单元测试。在我正在测试的方法中,它尝试访问我使用 JBoss 部署脚本设置的系统 属性,因此我的单元测试无法访问整个 JBoss 环境访问属性,因此在测试该方法时它 returns null。尝试在我的测试中直接模拟和设置系统变量,但系统 属性 仍在我正在测试的 class 中返回 null。
正在测试的class:
//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
方法中设置系统 属性 但没有成功。
确保在实例化被测试的 class 之前调用 System.setProperty("property.name", "https://justatest.com/dav/bulk");
,否则静态字段将始终为 null。
考虑为此使用 @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");
}
如果你想使用 jMocki,但你必须确保在你的 class-under-test 被加载之前完成它(因为静态字段)。
@BeforeClass
public static void fakeSystemProperty() {
new MockUp<System>() {
@Mock
public String getProperty(String key) {
return "https://justatest.com/dav/bulk";
}
};
}
另一种方法是修改 class-under-test 并部分模拟这个,例如:
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";
}
};
}
结合使用 testng 和 jmockit 进行一些单元测试。在我正在测试的方法中,它尝试访问我使用 JBoss 部署脚本设置的系统 属性,因此我的单元测试无法访问整个 JBoss 环境访问属性,因此在测试该方法时它 returns null。尝试在我的测试中直接模拟和设置系统变量,但系统 属性 仍在我正在测试的 class 中返回 null。
正在测试的class:
//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
方法中设置系统 属性 但没有成功。
确保在实例化被测试的 class 之前调用 System.setProperty("property.name", "https://justatest.com/dav/bulk");
,否则静态字段将始终为 null。
考虑为此使用 @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");
}
如果你想使用 jMocki,但你必须确保在你的 class-under-test 被加载之前完成它(因为静态字段)。
@BeforeClass
public static void fakeSystemProperty() {
new MockUp<System>() {
@Mock
public String getProperty(String key) {
return "https://justatest.com/dav/bulk";
}
};
}
另一种方法是修改 class-under-test 并部分模拟这个,例如:
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";
}
};
}