mockito如何 mock同一个对象属性里面嵌套相同对象多次
时间: 2024-03-12 09:43:10 浏览: 237
Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例
在 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` 中使用了返回值列表,那么这个列表的长度必须和函数被调用的次数相同,否则会抛出异常。
阅读全文