java - 如何使用 jmockt 在 Enum 类中模拟它?

标签 java unit-testing enums jmockit

我正在尝试为下面的旧遗留枚举类编写单元测试。我尝试进行单元测试的方法是 - 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 模拟为 PHXSLCLVS CORP 以便在 toLocalPookString 中它不应该进入 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/

相关文章:

java - 由 java 时间戳构造并写入 parquet 的 Spark 数据帧的内容是否会根据系统的本地时区而有所不同?

java - 如何使 JavaFX MediaView 拉伸(stretch)媒体填充父容器?

unit-testing - 如何运行具有不同所需功能的多个 Selenium 测试

for-loop - 简化迭代循环(使用 crate )

python - PyQt5 && QML 导出枚举

java - 如何从设备读取十六进制格式的数据?

java - ResourceProxy 类应该做什么?

python - 单元测试 pythons telnetlib

iphone - iOS 上 Xcode 4 的 OCUnit 示例?

java - 如何根据应用程序的体系结构和类正确地组织两个枚举的结构,它们之间存在多对多关系?