具有私有 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。
我正在使用 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。