为什么会有这么多关于“部分嘲弄”和需要它的代码的憎恨?
下面是一个(理论上)实现的示例:
public ComplexResult1 operationA(Stimulus a) {
{
...
result = ...;
}
auditTheChange(a);
}
public ComplexResult2 operationB(Stimulus b) {
{
...
result = ...;
}
auditTheChange(b);
return result;
}
void auditTheChange(Stimulus stim) {
// do a bunch of stuff to record the change
// and interact with another outside service
}现在,以我的理解,这是很好的重构代码。
如果我想对operationA和operationB进行单元测试,并确保在每个场景中都进行审计,但不需要测试审计代码的具体内容,我将使用部分模拟。
我没有看到/理解导致这么多项目的原因(EasyMock,Mockito等)推荐重构吗?
发布于 2010-09-27 22:56:24
如果审计确实是类的内部功能,那么代码应该作为单元测试的一部分进行测试。为什么您的类同时处理复杂操作和审核?审核是否可以转移到单独的类中?
如果是这样的话,将审计作为一个协作者引入这个类并模拟它。如果没有,则进行单元测试。
您可以使用部分模拟,但在本例中,我认为这表明类做的太多了。
发布于 2019-10-05 14:48:11
关键是“被测试的单元是什么”。
很多开发人员认为OO。在面向对象( OO )中," object“是软件的单元,因此对象也是在单元测试中测试的单元。在您的示例中,auditTheChange()是对象中的一个私有方法。单元测试应该只关注公共方法的行为。模拟私有方法意味着单元测试用例处理单元的某些实现细节,这被认为是“代码嗅觉”。
一些开发人员认为软件的单位是“方法”。在你的例子中,你确实这样想。因为operationA和operationB太复杂,所以可以创建auditTheChange,这样就可以降低单元operationA和operationB的复杂性。如果您这样认为,部分模拟并不是“代码嗅觉”,因为该方法是正在测试的单元,而模拟私有方法也意味着“关注行为,而不是实现细节”。
这里没有绝对的对错。这真的取决于你的项目或团队的性质。我在一家使用Spring开发企业信息系统的公司工作。在Spring中,几乎所有的业务逻辑都在xxxService对象中实现。当方法太复杂时,我们只是将一些逻辑移到私有方法上,就像您在示例中所做的那样。如果我们总是将这个逻辑移到一个新的类中,那么将会有很多类和对象被创建,这将使程序很难维护。因此,我们只是将逻辑转移到私有方法,并使用了部分模拟。事实上,很多人都需要部分的嘲弄。您可以检查这个莫基托文档。一开始,mockito认为部分模仿是一种代码气味。经过长时间的讨论和辩论,他们现在也支持局部的嘲弄。
发布于 2020-02-26 17:34:37
如果auditTheChange是一个私有函数,那么您就不会编写一个测试来验证它的调用。您不希望单元测试与实现紧密耦合。
一般情况下:不对私有方法进行单元测试,。
https://stackoverflow.com/questions/3806977
复制相似问题