weixin_42406059 2013-04-17 09:50
浏览 900
已采纳

对于public方法中调用多重private方法应该如何mock

假如有如下方法
[code="java"]
public void publicMethod()
{
if(condition1)
privateMethod1();
else
privateMethod2();

}

private void privateMethod1()
{
......
privateMethod3();
}

private void privateMethod2()
{
......
privateMethod4();
}
[/code]

在上述私有方法中,可能会依赖很多的外部类,并且可能会有多重分支,这样的话以publicMothod做为入口,并且mock私有方法中依赖的所有的外部类行为来进行测试,将会非常麻烦,并且分支都是级数级的。请问这种情况大家都是如何进行单元测试的?

  • 写回答

3条回答 默认 最新

  • yunzhu666 2013-04-17 10:15
    关注

    [color=red]单元测试的重点是“单元”,所以测试对象不应过大,而应该尽量小而且职责应该单一。[/color]
    如果测试对象过大或者过于复杂,则说明设计存在问题,需要重构,这正是单元测试的宗旨和目标————促进重构改善设计。

    这里private里面调用了多个外部类,应该尽量简化,同时每个调用的外部类方法也应该是单独进行测试的。
    [color=red]另外,如果你重构之后还是需要测试这个private方法,可以把它改成protected,然后单元测试类继承这个类,就可以进行测试了,因为子类是可以访问父类的protected方法的。[/color]

    [color=blue]向LZ推荐一本单元测试的书————JUnit.Recipes(JUnit菜谱)。书中讲了N多中单元测试中的技巧和解决方案,非常实用,建议一览,会有恍然大悟之感。书里讲的那些技巧非常巧妙,有些你可能在实践中曾经自己发现过并引以为豪,但是看了这本书,你会发现它里面已经罗列出来了,我就曾有这种经历。[/color]

    下面这是网上转来的,说的还是有一定道理的:
    如何对private方法进行单元测试
    问:如何对私有方法进行单元测试?
    答:重点在于,你不应该有任何方法是从一开始设计出来就是private的,因为你的每段程序都应该在单元测试的驱动之下产生,而测试是不可能驱动出 来一个private方法的。那么private方法从哪里来?只能从重构而来。所以答案是:private方法是不需要测试的,因为它是重构的产物,而 重构是不改变程序可观察之行为的。既然行为不改变,测试自然也不需要有任何改变,所以不需要针对private方法建立任何新的测试。
    问:但是,如果private方法确实出现问题了怎么办?如果确实希望用测试来弄清一个private方法里面到底发生了什么,该怎么办?
    答:如果一个private方法复杂到你不能一眼看清它,那它就太复杂了,你应该把它重构成为一个独立的class,然后针对这个class来建立单元测试。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况