我正在使用JUnit和JMockit编写一些单元测试,需要为一个以私有枚举实例作为参数的方法编写JMockit MockUp
。这是我需要模拟的类:
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
,我需要返回不同的Long
值。如果Metric
枚举是公开的,那就足够直截了当了。类似的东西:
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
更改为公开之外,还有什么方法可以实现这一目标吗?这可能最终成为实现这一目标的唯一方法,但我不是Result
课程的作者,并且我并不完全熟悉将Metric
私有化的原因。
答案 0 :(得分:2)
根据文件:
@Mock注释标记了模型类中的那些方法,这些方法旨在为模拟类中的相应方法(相同签名)提供模拟实现。
如果枚举是私有的,则不能在单元测试中使用它,因为它在课堂外不可见。那么你就无法定义一个合适的MockUp。
您必须让Metric
课程更加明显(至少包私有)或模拟整个Result
课程。