考虑我需要模拟以下行
employee.addOffer(employee, new Offer(details));
现在我需要嘲笑new Offer(details)
什么都不做
我尝试的方式是
doNothing().when(employee).addOffer(any(Employee.class), any(Offer.class));
这与NullPointerException
失败,因为它尝试执行new Offer(details)
而details
无效
我如何模仿new Offer(details)
返回任何其他模拟?
答案 0 :(得分:2)
你应该模仿Offer
:
Offer mockOffer = mock(Offer.class);
employee.addOffer(employee, mockOffer);
答案 1 :(得分:0)
我想注意Mockito mocks的方法默认不做任何事情,所以doNothing
在这里是多余的。
我不想直接回答你的问题,而是想对你的测试提出一些看法。它是模拟值类型,在这种情况下是Employee
,一般来说我会避免模拟Employee
,Offer
,Detail
等任何值类型。
相反,由于您的测试似乎是关于利用数据的一些东西,我会编写一个测试,其中值类型是夹具,并且将验证输出的值类型数据。
如果你需要嘲笑,你应该专注于合作者(从行为的角度来说)。
例如,想象一下以下设计(它的伪代码):
class OfferProcessor {
OfferClassifier classifie;
Offer...
...
process() { ... }
}
interface OfferClassifier {
classify()
}
class EmployeeOfferCalssifier extends OfferClassifier {
classify() { ... }
}
OfferProcessor
,显然正在与 合作者 合作,您希望将测试重点放在他们之间的互动上。例如,一个测试可以专注于分类,模拟OfferClassifier
并验证是否classify
被调用。
另一方面,OfferClassifier
女巫是一个看起来就是操纵数据的界面。因此,对于EmployeeOfferClassifier
,我会将测试重点放在输入和输出数据上。
当然,现实可能具有更复杂的粒度,但这种测试方法仍然适用。同样在@DavidWallace在上面的评论中指出的article中,如果使用工厂/提供者模式,也可以使用相同的方法。