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

问题描述

假如有如下方法public void publicMethod(){ if(condition1) privateMethod1(); else privateMethod2(); }private void privateMethod1(){ ...... privateMethod3();}private void privateMethod2(){ ...... privateMethod4();}在上述私有方法中,可能会依赖很多的外部类,并且可能会有多重分支,这样的话以publicMothod做为入口,并且mock私有方法中依赖的所有的外部类行为来进行测试,将会非常麻烦,并且分支都是级数级的。请问这种情况大家都是如何进行单元测试的?

解决方案

单元测试的重点是“单元”,所以测试对象不应过大,而应该尽量小而且职责应该单一。如果测试对象过大或者过于复杂,则说明设计存在问题,需要重构,这正是单元测试的宗旨和目标————促进重构改善设计。这里private里面调用了多个外部类,应该尽量简化,同时每个调用的外部类方法也应该是单独进行测试的。另外,如果你重构之后还是需要测试这个private方法,可以把它改成protected,然后单元测试类继承这个类,就可以进行测试了,因为子类是可以访问父类的protected方法的。向LZ推荐一本单元测试的书————JUnit.Recipes(JUnit菜谱)。书中讲了N多中单元测试中的技巧和解决方案,非常实用,建议一览,会有恍然大悟之感。书里讲的那些技巧非常巧妙,有些你可能在实践中曾经自己发现过并引以为豪,但是看了这本书,你会发现它里面已经罗列出来了,我就曾有这种经历。下面这是网上转来的,说的还是有一定道理的:如何对private方法进行单元测试问:如何对私有方法进行单元测试?答:重点在于,你不应该有任何方法是从一开始设计出来就是private的,因为你的每段程序都应该在单元测试的驱动之下产生,而测试是不可能驱动出 来一个private方法的。那么private方法从哪里来?只能从重构而来。所以答案是:private方法是不需要测试的,因为它是重构的产物,而 重构是不改变程序可观察之行为的。既然行为不改变,测试自然也不需要有任何改变,所以不需要针对private方法建立任何新的测试。问:但是,如果private方法确实出现问题了怎么办?如果确实希望用测试来弄清一个private方法里面到底发生了什么,该怎么办?答:如果一个private方法复杂到你不能一眼看清它,那它就太复杂了,你应该把它重构成为一个独立的class,然后针对这个class来建立单元测试。
解决方案二:
1. 对私有方法的测试, 有两种方法是. 第一: 把权限级别改为包级别. 第二: 通过反射. 我一般用第一种方式. 2. 关于测试依赖的问题. 如果累A方法a(也就是A.a)依赖一个外部组件的B的方b(也就是B.b), 通常我会把对B.b的调用抽取为一个A的一个方法c: private void c (){ B.b(); }然后把c mock掉.
解决方案三:
PowerMock 可以包级别 也行

时间: 2024-08-30 13:32:11

对于public方法中调用多重private方法应该如何mock的相关文章

c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析

以下是对c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区进行了详细的分析介绍,需要的朋友可以过来参考下   复制代码 代码如下: #define Test using System; namespace Wrox.ProCSharp.ParameterTestSample ...{  class ParemeterTest  ...{     static void TestInt(int[] ints,int i)     ...{         ints[0] = 10

选择-如何在一个方法内返回UTF-8格式的字符串,在另一个方法中调用输出?

问题描述 如何在一个方法内返回UTF-8格式的字符串,在另一个方法中调用输出? package com.secutiry.rsa;import java.util.Scanner;public class Prtest { public String Phintx(){ Scanner cc =new Scanner(System.in); //下马这行会报错,选择try catch 或者 throw declaration //选择try catch 则无法return 选择throw dec

java-抽象类 子类实现相同方法 想想去执行抽象类中的方法,在从抽象类中调用子类具体方法

问题描述 java-抽象类 子类实现相同方法 想想去执行抽象类中的方法,在从抽象类中调用子类具体方法 如下代码,想得到这样结果execute AA before execute..C execute AA after 应该怎么处理 public class Test { public static void main(String[] args) { C c = new C(); c.A(); } } interface YY { public void A(); } abstract clas

handle-关于Android中调用了post方法后数据还是显示不出来的问题

问题描述 关于Android中调用了post方法后数据还是显示不出来的问题 Map params = new HashMap(); params.put(HZConstants.USER_TOKEN, HZApplication.get().getToken()); NetworkController.getInstance(mContext).drawperform(params,new NetworkCallBack() { @Override public void response(St

asp.net中调用存储过程的方法_实用技巧

本文实例讲述了asp.net中调用存储过程的方法.分享给大家供大家参考,具体如下: 一.建立并调用一个不带参数的存储过程如下: CREATE PROCEDURE 全部学生<dbo.selectUsers> AS SELECT * FROM 学生 GO EXEC 全部学生 建立并调用一个带参数的存储过程如下: CREATE PROCEDURE 学生查询1 @SNAME VARCHAR(8),@SDEPT VARCHAR(20) AS SELECT * FROM 学生 WHERE 姓名=@SNAM

关于在同控制器中方法中调用没有权限的方法的提问

问题描述 关于在同控制器中方法中调用没有权限的方法的提问 Index 控制器中,我写了一个有权限的A方法,然后我又写了一个我没有权限B方法,当我在A方法中用 $this->B(); 时,居然在A方法中能够接收到 B中 return 出来的值 跪求解答 解决方案 YII 如何在控制器里调用 model 方法YII 如何在控制器里调用 model 方法

javascript-js类中一个方法无法调用弄一个方法

问题描述 js类中一个方法无法调用弄一个方法 <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> function ui(){ this.we=function(){ alert("wed"); } this.test=function(e

《Android的设计与实现:卷I》——第2章2.4 在Java中调用JNI实现方法

2.4 在Java中调用JNI实现方法 本节介绍如何在Java中调用JNI实现方法.JNI数据类型转换.JNI方法命名规则,以及JNI方法签名规则. 2.4.1 Java数据类型与JNI数据类型转换 Java中调用Native方法传递的参数是Java类型的,这些参数需要经过Dalvik虚拟机转化为JNI类型才能被JNI层识别.下面分基本类型和引用类型介绍这种转化关系. 1.基本类型转化关系 表2-1列出了基本类型的转化关系. 2.引用类型转化关系 JNI的引用类型定义了九种数组类型,以及jobj

Smarty中调用FCKeditor的方法_php实例

本文实例讲述了Smarty中调用FCKeditor的方法,分享给大家供大家参考.具体实现方法如下: FCKeditor是目前互联网上最好的在线编辑器. smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序 员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要. 在Smarty中调用FCKeditor的文件: 复制代码 代码如下: requ