我正在尝试为下面的旧遗留枚举类编写单元测试。我尝试进行单元测试的方法是 - toLocalPookString
。
每当我运行单元测试代码时,它总是进入 toLocalPookString
方法中的 if 语句
,因为 this
总是得到解析到CORP
。
public enum DatacenterEnum {
CORP, PHX, SLC, LVS;
private static final DatacenterEnum ourlocation = compareLocation();
private static DatacenterEnum compareLocation() {
// some code here
}
private String toLocalPookString() {
if (this == CORP || !(TestUtils.getEnvironmentName().equalsIgnoreCase("production"))) {
return "/pp/dc/phx";
}
return "/pp/dc/" + name().toLowerCase();
}
public static final String BETA_POOK_STRING = ourlocation.toLocalPookString();
}
除了 之外,有什么方法可以将
以便在 this
模拟为 PHX
或 SLC
或 LVS
CORPtoLocalPookString
中它不应该进入 if 语句
中?我这里使用的是jmockit。
new MockUp<TestUtils>() {
@Mock
public String getEnvironmentName() {
return "production";
}
};
String ss = DatacenterEnum.BETA_POOK_STRING;
System.out.println(ss);
这很简单,但不知何故我不明白该怎么做?有什么想法吗?
最佳答案
好吧,您可以轻松模拟枚举,如下所示:
new MockUp<DatacenterEnum>() {
@Mock DatacenterEnum compareLocation() { return DatacenterEnum.LVS; }
};
但是,由于 JVM 只能对给定的类/枚举执行一次静态初始化,因此只有在枚举尚未加载和初始化时测试才会起作用。 因此,更可靠的测试如下。
@Test
public void whenDatacenterIsNotCORPThenLocalPookStringShouldIncludeEnumName() {
new MockUp<TestUtils>() {
@Mock String getEnvironmentName() { return "production"; }
};
DatacenterEnum notCORP = DatacenterEnum.LVS;
String ss = Deencapsulation.invoke(notCORP, "toLocalPookString");
assertTrue(ss.toUpperCase().endsWith(notCORP.name()));
}
这是可行的,但请注意,为私有(private)
方法编写单独的测试通常被认为是不好的形式。理想情况下,测试应该调用公共(public)方法来间接执行私有(private)方法。然而,在这种特殊情况下,没有这样的公共(public)方法,所以我想这是可以接受的。
关于java - 如何使用 jmockt 在 Enum 类中模拟它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188902/