Java 如何使用jmockt在枚举类中模拟这一点?
我正在尝试为我下面的旧遗留枚举类编写单元测试。我尝试进行单元测试的方法是-Java 如何使用jmockt在枚举类中模拟这一点?,java,unit-testing,enums,jmockit,Java,Unit Testing,Enums,Jmockit,我正在尝试为我下面的旧遗留枚举类编写单元测试。我尝试进行单元测试的方法是-toLocalBookString 每当我运行单元测试代码时,它总是进入toLocalBookString方法中的if语句中,因为这个总是被解析为CORP public enum DatacenterEnum { CORP, PHX, SLC, LVS; private static final DatacenterEnum ourlocation = compareLocation(); pr
toLocalBookString
每当我运行单元测试代码时,它总是进入toLocalBookString
方法中的if语句中,因为这个
总是被解析为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();
}
除了CORP
之外,我还有什么办法可以把这个模拟成PHX
或SLC
或LVS
,这样在ToLocalBookString
中它就不应该进入if语句中了吗?我在这里使用jmockit
new MockUp<TestUtils>() {
@Mock
public String getEnvironmentName() {
return "production";
}
};
String ss = DatacenterEnum.BETA_POOK_STRING;
System.out.println(ss);
新模型(){
@嘲弄
公共字符串getEnvironmentName(){
返回“生产”;
}
};
字符串ss=DatacenterEnum.BETA_POOK_字符串;
系统输出打印LN(ss);
这很简单,但不知怎的,我不明白怎么做?有什么想法吗?好吧,您可以很容易地模拟枚举,如下所示:
new MockUp<DatacenterEnum>() {
@Mock DatacenterEnum compareLocation() { return DatacenterEnum.LVS; }
};
新模型(){
@模拟DatacenterEnum compareLocation(){返回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()));
}
@测试
当数据中心不包含LocalPookString时,公共无效应包含EnumName(){
新模型(){
@模拟字符串getEnvironmentName(){返回“生产”;}
};
DatacenterEnum notCORP=DatacenterEnum.LVS;
字符串ss=Deencapsulation.invoke(notCORP,“toLocalBookString”);
assertTrue(ss.toUpperCase().endsWith(notCORP.name());
}
这是可行的,但请注意,为private
方法编写单独的测试通常被认为是不好的形式。理想情况下,测试应该调用公共方法,从而间接地使用私有方法。然而,在这种特殊情况下,没有这样的公开方法,所以我想这是可以接受的。我很困惑,但这可能只是漫长的一天。你能澄清一下吗?如果您正在对本地页面字符串进行单元测试,为什么要模拟此代码?这不是你的SUT吗?@Lilshieste:我想这对我来说也是漫长的一天。但简而言之,我需要模拟toLocalBookString
,这样它就不会进入if块。我想我只是不清楚您在测试什么。如果这不是您要测试的,为什么是this==CORP
?(我认为compareLocation
函数的详细信息会有所帮助。)