Mockito单元测试mock数据,根据对象中的参数mock不同的返回用Mockito.argThat()

当mock的方法参数是个对象时,可以用Mockito.argThat()去mock请求

public class Result{
	private String name;
    private String age;
	private String id;
}
public class Request{
	private String id;
}

@SpringBootTest
public class ServiceTest {
	
	@Resource
    private BusinessService businessService;

	//要mock的Bean
    @MockBean
    private Service service;
    
    @Test
    public void test() {
    String str= "{"name":"张三","age":"12","id":"001"}"
	Result result= JSON.parseObject(str, Result.class);
	//当调用service.getPurchaseReceipt()方法时会返回mock的值
	Mockito.when(service.getPurchaseReceipt(Mockito.argThat(new ArgumentMatcher<Request>() {
			@Override
            public boolean matches(Request request) {
                if (request == null) {
                    return false;
                }
                if ("001".equals(request.getId())) {
                    return true;
                }
                return false;
            }
		}))).thenReturn(result);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ,如果要使用 Mockitomock 同一个对象属性嵌套相同的对象多次,可以使用 `Answer` 接口来设置不同返回值。具体来说,可以针对每个需要 mock对象设置一个返回值列表,然后在 `Answer` 的 `answer` 方法使用这些列表来模拟多次调用返回不同的值。 举个例子,假设有以下的类和对象: ```java public class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } // getter and setter methods } public class Group { private String name; private List<User> users; public Group(String name, List<User> users) { this.name = name; this.users = users; } // getter and setter methods } User user1 = new User("Alice", 20); User user2 = new User("Bob", 25); List<User> users = new ArrayList<User>(); users.add(user1); users.add(user2); Group group = new Group("Group1", users); ``` 那么在单元测试,可以这样 mock 对象属性嵌套相同的对象多次: ```java import static org.mockito.Mockito.*; public class TestMockito { @Test public void testMockNestedObjects() { User userMock1 = mock(User.class); User userMock2 = mock(User.class); Group groupMock = mock(Group.class); when(userMock1.getName()).thenReturn("AliceMock1"); when(userMock2.getName()).thenReturn("BobMock1"); when(groupMock.getName()).thenReturn("GroupMock1"); when(userMock1.getAge()).thenReturn(21); when(userMock2.getAge()).thenReturn(26); List<List<User>> usersList = new ArrayList<List<User>>(); usersList.add(Arrays.asList(userMock1, userMock2)); usersList.add(Arrays.asList(userMock2, userMock1)); when(groupMock.getUsers()).thenAnswer(new Answer<List<List<User>>>() { private int count = 0; @Override public List<List<User>> answer(InvocationOnMock invocation) throws Throwable { return usersList.get(count++); } }); assertEquals("AliceMock1", userMock1.getName()); assertEquals("BobMock1", userMock2.getName()); assertEquals("GroupMock1", groupMock.getName()); assertEquals(users, groupMock.getUsers()); when(userMock1.getName()).thenReturn("AliceMock2"); when(userMock2.getName()).thenReturn("BobMock2"); when(groupMock.getName()).thenReturn("GroupMock2"); assertEquals("AliceMock2", userMock1.getName()); assertEquals("BobMock2", userMock2.getName()); assertEquals("GroupMock2", groupMock.getName()); assertEquals(users, groupMock.getUsers()); } } ``` 在上面的测试函数,我们使用 `mock` 函数创建了需要 mock对象,然后分别设置了它们的属性和返回值列表。在 `when` ,我们使用了这些返回值列表来模拟多次调用返回不同的值。在 `groupMock.getUsers()` ,我们使用了 `Answer` 接口来模拟多次调用返回不同的值。最后在测试,我们分别测试了每次调用返回的值是否正确。 需要注意的是,在使用 `Answer` 接口时,我们需要在 `answer` 方法记录当前调用的次数,并从返回值列表取出相应的值返回,这样才能模拟多次调用返回不同的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值