2

考虑到我需要模拟以下行

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

4

2 回答 2

2

你应该模拟Offer

Offer mockOffer = mock(Offer.class);
employee.addOffer(employee, mockOffer);
于 2013-08-10T00:31:33.753 回答
0

我想指出 Mockito 模拟的方法默认什么都不做,所以doNothing这里是多余的。

我不想直接回答你的问题,而是想指出一些关于你的测试的事情。它模拟值类型,在这种情况下Employee,一般来说,我会避免模拟任何值类型Employee,如Offer, Detail, 等。

相反,由于您的测试似乎是关于利用有关数据的某些东西,我会编写一个测试,其中值类型是固定装置,并且输出的值类型数据将得到验证。

如果您需要模拟,您应该关注合作者(在行为意义上)。


例如想象以下设计(它是伪代码):

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

    process() { ... }
}

interface OfferClassifier {
    classify()
}

class EmployeeOfferCalssifier extends OfferClassifier {
    classify() { ... }
}
  1. OfferProcessor,显然是与合作者一起工作,它是你想要专注于他们之间交互的测试。例如,一项测试可以专注于所调用的分类、模拟OfferClassifier和验证。classify

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

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

于 2013-08-12T09:54:45.863 回答