private方法如何进行单元测试?

目录

问题来了

解决方法

1.不测试

2.改权限

3.进行内部测试

4.使用反射

具体实现

5 测试

补充

参考


在上一篇中:https://blog.csdn.net/qq_36110736/article/details/107774507,对Junit单元测试框架有了一定了解。

问题来了

但紧接着问题就来了,对于一些 private 修饰的方法无法在外部直接调用,导致分支难以覆盖。

解决方法

        这里先来说一下网上对private修饰的方法进行单元测试的几种解决方法:

1.不测试

        这是最消极的一种办法,毕竟大家都不会闲的没事,非要对一个private方法进行测试,一般来说都是有某种不可抗拒原因导致我们必须想办法进行测试(譬如说要求测试覆盖率达到一定标准,包含了复杂业务逻辑实现),否则的活没必要测试private方法。

2.改权限

         将private方法变成protected或者package

         这也是一种办法吧,但问题随之而来——当初我为啥要将方法的权限修饰为private访问权限?这种方法在我看来根本不可取。

3.进行内部测试

         在被测类中编写仅对测试有用的代码。

        至于这种就更扯淡了,逻辑测试写在一起,大概只有初学者会这么搞吧,当你在某个项目组里这么做的时候你最好祈祷别被负责人打死。

4.使用反射

        此处我推荐使用反射来完成,这种才是真正解决问题的方式。

4.1 什么是反射

        Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

具体实现

首先,在原有代码里添加一个private方法

public class Calculate {
    public int add(int a,int b){
        return a+b;
    }
    public int subtract(int a,int b){
        return a-b;
    }
    public int multiply(int a,int b){
        return a*b;
    }
    public int divide(int a,int b){
        if (!isZero(b)){
            return 0;
        }else {
            return a/b;
        }

    }
    private boolean isZero(int num){
        if (num != 0){
            return false;
        }else {
            return true;
        }
    }
}

5 测试

        在测试代码里添加对应测试方法:

    @Test
    public void isZeroTest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class c = Calculate.class;
        Calculate calculate = new Calculate();
        Method method = c.getDeclaredMethod("isZero", int.class);// 声明调用哪个类的哪个方法
        method.setAccessible(true);//允许处理私有方法
        Assert.assertTrue((boolean)method.invoke(calculate,0));//断言+具体调用
        Assert.assertFalse((boolean)method.invoke(calculate,1));
    }

当然,由于测试类比较简单,所以也可以通过对 divide 方法进行分支覆盖的方式测试到isZero方法。

补充

什么是断言?

        编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
        使用断言可以创建更稳定、品质更好且 不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)

参考

https://baike.baidu.com/item/%E6%96%AD%E8%A8%80/13021995

https://baike.baidu.com/item/JAVA%E5%8F%8D%E5%B0%84%E6%9C%BA%E5%88%B6

https://blog.csdn.net/caib1109/article/details/51338743

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于私有方法单元测试,通常有以下几种方式: 1. 使用反射:通过反射机制,可以访问和调用私有方法。在单元测试中,可以使用反射来获取私有方法的引用,并进行测试。这种方法相对较为灵活,但也可能会破坏封装性。 2. 修改访问权限:将私有方法的访问权限修改为public或protected,以便在单元测试中直接调用。这种方法需要谨慎使用,因为可能会导致安全性和封装性问题。 3. 测试公共接口:私有方法通常是由公共接口调用的,因此可以通过测试公共接口来间接测试私有方法。这样可以确保私有方法在被公共接口调用时能够正常工作。 4. 使用内部类或包级私有方法:在同一个类内部或同一个包内创建一个内部类或包级私有方法,以便可以在单元测试中访问和调用私有方法。 无论选择哪种方式,都应该注意以下几点: - 单元测试应该关注方法的行为和输出,而不是具体的实现细节。私有方法通常是用来支持公共接口的,所以测试重点应该放在公共接口上。 - 单元测试应该覆盖私有方法的各种情况和边界条件,以确保私有方法的正确性和健壮性。 - 私有方法的命名通常以"_"或"__"开头,以示其为私有方法,但这只是一种约定,并不是Java语言本身的限制。 总之,选择适合的方式来测试私有方法,并确保测试覆盖率足够高,可以帮助提高代码质量和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值