Mockito关于同一个方法多次执行根据参数不同来mock不同的返回值

 


前言

今天写项目UT的时候遇到需要根据同一个方法多次执行根据参数不同来mock不同的返回值,找到解决方案,于此记录。

 

一、场景

相同的方法根据参数不同来mock不同的返回值
Date maxDate = summaryMapper.getMaxDATE(condition, "MONTH");
Date maxDate = summaryMapper.getMaxDATE(condition, "WEEK");
Date maxDate = summaryMapper.getMaxDATE(condition, "DAY");

这里原代码是根据三个相同的方法不同的日期type找出最大的日期,写UT的话则需要对此方法mock三个相应的返回值。

二、代码示例

这里我是用的是Mockito中的Answer,根据参数列表里面传的值来确定返回值,参数列表下标从0开始

when(summaryMapper.getMaxDATE(anyString(), anyString())).thenAnswer(mock -> {
    if ("MONTH".equals(mock.getArgument(1))) {
        return this.addDate(new Date(), -2);
    }
    if ("WEEK".equals(mock.getArgument(1))) {
        return this.addDate(new Date(), -3);
    }
    if ("DAY".equals(mock.getArgument(1))) {
        return this.addDate(new Date(), -3);
    }
    return null;
});

 


总结

问题看似简单,但是找到解决方案的过程是费时费力的,有用的话点个赞再走。

 

Mockito 中,如果要 mock 同一个对象属性中嵌套相同的对象多次,可以使用 `side_effect` 参数来设置不同返回值。具体来说,可以针对每个需要 mock 的对象设置一个返回值列表,然后在 `side_effect` 中使用这些列表来模拟多次调用返回不同的值。 举个例子,假设有以下的类和对象: ```python class User: def __init__(self, name, age): self.name = name self.age = age class Group: def __init__(self, name, users): self.name = name self.users = users user1 = User('Alice', 20) user2 = User('Bob', 25) group = Group('Group1', [user1, user2]) ``` 那么在测试中,可以这样 mock 对象属性中嵌套相同的对象多次: ```python import unittest from unittest.mock import Mock class TestMockito(unittest.TestCase): def test_mock_nested_objects(self): user_mock1 = Mock(spec=User, name='UserMock1') user_mock2 = Mock(spec=User, name='UserMock2') group_mock = Mock(spec=Group, name='GroupMock') user_mock1.name = 'AliceMock1' user_mock2.name = 'BobMock1' group_mock.name = 'GroupMock1' user_mock1.age = 21 user_mock2.age = 26 group_mock.users = [[user_mock1, user_mock2], [user_mock2, user_mock1]] user_mock1_return_values = ['AliceMock2', 'AliceMock3'] user_mock2_return_values = ['BobMock2', 'BobMock3'] group_mock_return_values = ['GroupMock2', 'GroupMock3'] user_mock1.name.side_effect = user_mock1_return_values user_mock2.name.side_effect = user_mock2_return_values group_mock.name.side_effect = group_mock_return_values self.assertEqual(user_mock1.name, 'AliceMock2') self.assertEqual(user_mock2.name, 'BobMock2') self.assertEqual(group_mock.name, 'GroupMock2') self.assertEqual(group_mock.users, [[user_mock1, user_mock2], [user_mock2, user_mock1]]) self.assertEqual(user_mock1.name, 'AliceMock3') self.assertEqual(user_mock2.name, 'BobMock3') self.assertEqual(group_mock.name, 'GroupMock3') self.assertEqual(group_mock.users, [[user_mock1, user_mock2], [user_mock2, user_mock1]]) ``` 在上面的测试函数中,我们使用 `Mock()` 函数创建了需要 mock 的对象,然后分别设置了它们的属性和返回值列表。在 `side_effect` 中,我们使用了这些返回值列表来模拟多次调用返回不同的值。最后在测试中,我们分别测试了每次调用返回的值是否正确。 需要注意的是,如果在 `side_effect` 中使用了返回值列表,那么这个列表的长度必须和函数被调用的次数相同,否则会抛出异常。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值