【问题标题】:How to mock this in an Enum class using jmockt?如何使用 jmockt 在 Enum 类中模拟这个?
【发布时间】:2014-04-20 23:55:32
【问题描述】:

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

每当我运行我的单元测试代码时,它总是在toLocalPookString 方法中的if statement 内,因为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();

}

除了CORP 之外,我有什么办法可以模拟thisPHXSLCLVS,以便在toLocalPookString 中它不应该进入if statement?我在这里使用 jmockit。

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

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

这很简单,但不知怎么我不明白怎么做?有什么想法吗?

【问题讨论】:

  • 我很困惑,但这可能是漫长的一天。你能澄清一下吗?如果您正在对toLocalPookString 进行单元测试,为什么要模拟thisthis 不是你的 SUT 吗?
  • @Lilshieste:我想这对我来说也是漫长的一天。但简而言之,我需要模拟 toLocalPookString 使其不会进入 if 块。
  • 我想我只是不清楚你在测试什么。为什么this == CORP 不是您要测试的? (我认为compareLocation 函数的详细信息会有所帮助。)

标签: java unit-testing enums jmockit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多