Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用jmockt在枚举类中模拟这一点?_Java_Unit Testing_Enums_Jmockit - Fatal编程技术网

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
函数的详细信息会有所帮助。)