Mockito:我如何模拟实例创建?

时间:2013-08-10 00:16:50

标签: java mocking mockito

考虑我需要模拟以下行

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)返回任何其他模拟?

2 个答案:

答案 0 :(得分:2)

你应该模仿Offer

Offer mockOffer = mock(Offer.class);
employee.addOffer(employee, mockOffer);

答案 1 :(得分:0)

我想注意Mockito mocks的方法默认不做任何事情,所以doNothing在这里是多余的。

我不想直接回答你的问题,而是想对你的测试提出一些看法。它是模拟值类型,在这种情况下是Employee,一般来说我会避免模拟EmployeeOfferDetail等任何值类型。

相反,由于您的测试似乎是关于利用数据的一些东西,我会编写一个测试,其中值类型是夹具,并且将验证输出的值类型数据。

如果你需要嘲笑,你应该专注于合作者(从行为的角度来说)。


例如,想象一下以下设计(它的伪代码):

class OfferProcessor {
    OfferClassifier classifie;
    Offer...
    ...

    process() { ... }
}

interface OfferClassifier {
    classify()
}

class EmployeeOfferCalssifier extends OfferClassifier {
    classify() { ... }
}
  1. OfferProcessor,显然正在与 合作者 合作,您希望将测试重点放在他们之间的互动上。例如,一个测试可以专注于分类,模拟OfferClassifier并验证是否classify被调用。

  2. 另一方面,OfferClassifier女巫是一个看起来就是操纵数据的界面。因此,对于EmployeeOfferClassifier,我会将测试重点放在输入和输出数据上。

  3. 当然,现实可能具有更复杂的粒度,但这种测试方法仍然适用。同样在@DavidWallace在上面的评论中指出的article中,如果使用工厂/提供者模式,也可以使用相同的方法。