【Mockito】Mock对象多次调用方法,返回不同结果

创建ArgumentMatcher,根据不同的入参匹配对应行为

    /**
     * 创建ArgumentMatcher,根据不同参数值来匹配对应的行为
     */
    private <T> T createArgumentMatcher(final Predicate<T> predicate) {
        return Mockito.argThat(new ArgumentMatcher<T>() {
            @Override
            public boolean matches(Object argument) {
                if (null == argument) {
                    return false;
                }
                return predicate.apply((T) argument);
            }
        });
    }

实现方法

        Predicate<ProductFlowFilter> one = new Predicate<ProductFlowFilter>() {
            @Override
            public boolean apply(@Nullable ProductFlowFilter filter) {
                return "0".equals(filter.getId1());
            }
        };
        Predicate<ProductFlowFilter> two = new Predicate<ProductFlowFilter>() {
            @Override
            public boolean apply(@Nullable ProductFlowFilter filter) {
                return "-999999".equals(filter.getId1());
            }
        };
        Mockito.when(productFlowDao.getViewFlowData(createArgumentMatcher(one))).thenReturn(json1);
        Mockito.when(productFlowDao.getViewFlowData(createArgumentMatcher(two))).thenReturn(json2);

创建对象one和two,根据对象属性的不同值返回不同的mock结果

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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` 中使用了返回值列表,那么这个列表的长度必须和函数被调用的次数相同,否则会抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值