首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分嘲弄代码的味道?

部分嘲弄代码的味道?
EN

Stack Overflow用户
提问于 2010-09-27 19:06:56
回答 3查看 2.1K关注 0票数 10

为什么会有这么多关于“部分嘲弄”和需要它的代码的憎恨?

下面是一个(理论上)实现的示例:

代码语言:javascript
复制
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等)推荐重构吗?

EN

回答 3

Stack Overflow用户

发布于 2010-09-27 22:56:24

如果审计确实是类的内部功能,那么代码应该作为单元测试的一部分进行测试。为什么您的类同时处理复杂操作和审核?审核是否可以转移到单独的类中?

如果是这样的话,将审计作为一个协作者引入这个类并模拟它。如果没有,则进行单元测试。

您可以使用部分模拟,但在本例中,我认为这表明类做的太多了。

票数 4
EN

Stack Overflow用户

发布于 2019-10-05 14:48:11

关键是“被测试的单元是什么”。

很多开发人员认为OO。在面向对象( OO )中," object“是软件的单元,因此对象也是在单元测试中测试的单元。在您的示例中,auditTheChange()是对象中的一个私有方法。单元测试应该只关注公共方法的行为。模拟私有方法意味着单元测试用例处理单元的某些实现细节,这被认为是“代码嗅觉”。

一些开发人员认为软件的单位是“方法”。在你的例子中,你确实这样想。因为operationA和operationB太复杂,所以可以创建auditTheChange,这样就可以降低单元operationA和operationB的复杂性。如果您这样认为,部分模拟并不是“代码嗅觉”,因为该方法是正在测试的单元,而模拟私有方法也意味着“关注行为,而不是实现细节”。

这里没有绝对的对错。这真的取决于你的项目或团队的性质。我在一家使用Spring开发企业信息系统的公司工作。在Spring中,几乎所有的业务逻辑都在xxxService对象中实现。当方法太复杂时,我们只是将一些逻辑移到私有方法上,就像您在示例中所做的那样。如果我们总是将这个逻辑移到一个新的类中,那么将会有很多类和对象被创建,这将使程序很难维护。因此,我们只是将逻辑转移到私有方法,并使用了部分模拟。事实上,很多人都需要部分的嘲弄。您可以检查这个莫基托文档。一开始,mockito认为部分模仿是一种代码气味。经过长时间的讨论和辩论,他们现在也支持局部的嘲弄。

票数 1
EN

Stack Overflow用户

发布于 2020-02-26 17:34:37

如果auditTheChange是一个私有函数,那么您就不会编写一个测试来验证它的调用。您不希望单元测试与实现紧密耦合。

一般情况下:不对私有方法进行单元测试,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3806977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档