我有以下代码(立面的一小部分)来覆盖单位测试。我正在使用Mockito来模拟属于服务层的功能。
Iterator<AbstractOrderEntryModel> entryModelItr = orderEntryModelList.iterator();
while (entryModelItr.hasNext()) {
AbstractOrderEntryModel entryModel = entryModelItr.next();
if (CollectionUtils.isNotEmpty(deletedPKList) && deletedPKList.contains(entryModel.getPk().toString())) {
entryModelItr.remove();
modelService.remove(entryModel);
}
}
我一直在编写测试案例,来调用要测试的功能并提供设置值的输入,以便可以实现代码的最大覆盖范围(如果不是应该这样做的方式,请正确的我)。
我的问题是我有函数 entryModel.getPk()
没有设置器,例如。我可以致电的entryModel.setPk()
。因此,它将在此行中抛出无效的指针例外。我不想模拟entryModel
对象。怎么去做?
(Pk
就像该模型类的主要关键。整个代码都写在Hybris平台上)
如果您测试具有真实对象的真实系统,那么缺乏主键将带来实际后果。最佳的测试"接缝"是覆盖模型类,提取呼叫,以便您可以将其外部化或在真实对象上进行监视。我强烈建议您牢记测试重构,但是您确实有一些选择在生产中零或最小的效果。
一种解决方案是创建自己的AbstractorderentryModel的具体子类,可能称为FakeorderEnderryModel,它具有您想要的构造函数。我认为这是这里最好的方法,尤其是因为它不会改变正在测试的系统。
另一种需要最小更改的解决方案是将entryModel.getPk().toString()
提取到正在测试的系统上的protected
方法中。在您的测试中,覆盖该方法提供基于地图的查找。一个重型解决方案是在策略模式(使用单个getPk(AbstractOrderEntryModel model)
方法)中创建一个" pkgetter"类,并提供用于测试的替代实现;在这里可能太杀了。
最后,要使用真实的数据对象,但仅覆盖其中一种或两种方法,请使用spy
:
AbstractOrderEntryModel model = spy(new ConcreteOrderEntryModel(...));
doReturn(42).when(model).getPk();
给定这个问题已有5年的历史了,如果有人好奇的是,杰夫·鲍曼(Jeff Bowman)的上述解决方案是否对我有用。
private AbstractOrderEntryModel abstractOrderEntryModel = new AbstractOrderEntryModel (){
@Override
public PK getPk() {
return de.hybris.platform.core.PK.BIG_PK;
}
};
猜猜我在监视模型对象时做错了什么,但是,覆盖GetPk()方法为我做了工作。