具有私有 class 参数的方法的 JMockit MockUp

JMockit MockUp for method with private class parameter

我正在使用 JUnit 和 JMockit 编写一些单元测试,需要为采用私有枚举实例作为参数的方法编写 JMockit MockUp。这是我需要模拟的 class:

public class Result {
    //Static constants representing metrics
    public static final Metric AVOIDABLE = Metric.avoidable;
    public static final Metric UNAVOIDABLE = Metric.unavoidable;

    // private enumeration of metric values
    private enum Metric {avoidable, unavoidable};

    public Long getTodayCount(Metric metric) { //<- instance of private enum
        return getValueForKey(metric);
    }
}

根据给定的具体 Metric,我需要 return 不同的 Long 值。如果 Metric 枚举是 public 就足够简单了。类似于:

private static class MockResult extends MockUp<Result> {
    @Mock
    Long getTodayCount(Metric m){ //<-- nope. Metric is private
        if(Result.AVOIDABLE.equals(m)){ //<-- can't call equals either
            return 1234L;    
        } else {
            return 4567L;
        }
    }
}

但是由于 Metric 是私有的,除了将 Metric 更改为 public 之外,还有什么方法可以做到这一点吗?这可能最终是实现这一目标的唯一方法,但我不是 Result class 的作者,并且我并不完全熟悉在第一个 Metric 私有化背后的原因地点。

根据文档:

The @Mock annotation marks those methods in the mock-up class which are meant to provide mock implementations for the corresponding methods (of the same signature) in the mocked class.

如果枚举是私有的,则不能在单元测试中使用它,因为它在 class 之外是不可见的。那你就不能定义一个合适的MockUp。

您必须使 Metric class 更显眼(至少包私有)或模拟整个 Result class。