如何使用jmockt在Enum类中模拟这个?

时间:2014-04-20 23:55:32

标签: java unit-testing enums jmockit

我正在尝试为我以下的旧版枚举类编写单元测试。我尝试进行单元测试的方法是 - toLocalPookString

每当我运行单元测试代码时,它总是进入if statement toLocalPookString方法,因为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 SLCLVSCORP模仿toLocalPookString不进去if statement?我在这里使用jmockit。

new MockUp<TestUtils>() {
    @Mock
    public String getEnvironmentName() {
    return "production";
    }
};

String ss = DatacenterEnum.BETA_POOK_STRING;
System.out.println(ss);

这很简单,但不知怎的,我无法理解如何做到这一点?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

好吧,你可以轻松模拟枚举,如下所示:

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方法编写单独的测试通常被视为不良形式。理想情况下,测试应该调用公共方法,间接地运用私有方法。然而,在这种特殊情况下,没有这样的公共方法,所以我想这是可以接受的。