python mock 打桩抛出异常

本文介绍了一种使用Python的mock库中的side_effect参数来模拟异常的方法,这种方法有助于提高单元测试的覆盖率。通过示例展示了如何对自定义函数及Python内置库函数进行异常模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总述:

在python的LLT测试中,需要保证覆盖率,但是有一个问题就是,python代码本来就很短,一个函数可能就几行,而且工程代码为了方便定位错误,会在函数的前后包围try_except_else块,这一个块就占了几行,如果没一个函数都无法覆盖这个异常处理的块,那么覆盖率将会受到很大的影响,这篇博客演示如何用python模拟异常。

做法:

其实只需要知道mock有一个side_effect的参数就很容易了,这个参数就是返回打桩函数的异常情况的。

示例:

import os

class classA():

    def getnum(self):
        return 0


    def self_function(self):
        try:
            if  self.getnum()==0:
                print("test_self_function you are very good")
        except:
            print("test_self_function the except module")
        else:
            print("test_self_function the else module")

定义测试函数:

    @patch("aa.classA.getnum")
    def test_self_function(self,mock_getnum):
        mock_getnum.side_effect = IOError()
        classA().self_function()

这样运行这个测试函数就会被捕获到异常。

当然这么强大的函数不仅仅可以打桩自己写的函数,甚至可以捕获python的内置库函数。

加上一个函数:

    def python_function(self,path):
        try:
            if  os.path.exists(path):
                print(" test_python_function you are very good")
        except:
            print("test_python_function the except module")
        else:
            print("test_python_function the else module")

其测试函数:

    @patch("os.path.exists")
    def test_python_function(self,mock_exists):
        mock_exists.side_effect = IOError
        classA().python_function("/you")

可以看到,这个地方也成功的捕获到了异常。

在单元测试中模拟(mock)一个方法抛出异常的情况,是验证代码在面对异常场景时能否正确处理的重要手段。通过设置 mock 对象的行为,可以控制其在特定调用时抛出指定的异常,从而测试程序的容错性和异常处理逻辑。 ### 模拟方法抛出异常的方式 使用 Mockito 提供的 `thenThrow()` 方法可以实现对异常的模拟。例如,当某个依赖对象的方法需要在测试中触发异常时,可以通过以下方式定义: ```java Mockito.when(mockObject.methodCall()).thenThrow(new RuntimeException("Mock Exception")); ``` 该语句表示当 `methodCall()` 被调用时,将抛出一个带有指定消息的 `RuntimeException` [^2]。 ### 应用示例 假设有一个删除操作的业务逻辑,其中涉及数据库访问层的调用,并且希望测试在发生异常时返回适当的响应: ```java try { Boolean entity = targetMapper.deleteComment(id); if (entity) { return RestResponse.ok().message("删除成功"); } return RestResponse.failed().message("删除失败"); } catch (Exception e) { return RestResponse.failed().message("删除失败,出现异常"); } ``` 为了测试异常分支,可以在单元测试中使用 PowerMockMockito 设置 `deleteComment()` 方法抛出异常: ```java Mockito.when(targetMapper.deleteComment(Mockito.anyLong())).thenThrow(new RuntimeException("Database connection failed")); ``` 这样,在执行测试时会触发异常路径,从而验证异常处理逻辑是否按预期工作 [^3]。 ### 静态方法与私有方法的异常模拟 对于静态方法或私有方法的异常模拟,通常需要结合 PowerMock 使用。例如,在调用静态方法时抛出异常,可以使用如下方式: ```java PowerMockito.mockStatic(TestStaticPrivateNonVoid1.class); PowerMockito.when(TestStaticPrivateNonVoid1.class, "testPublic1", TestConstants.FLAG1, testTableEntity) .thenThrow(new RuntimeException("Static method exception")); ``` 上述方式适用于需要 mock 静态方法并模拟其抛出异常的场景 [^1]。 ### 单元测试框架支持 大多数单元测试框架(如 JUnit、TestNG)都提供了良好的异常测试支持机制。结合 mock 框架使用时,能够更灵活地模拟各种边界条件和异常情况,确保代码的健壮性。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值