java单元测试使用mockito如何mock同一个对象属性里面嵌套相同对象多次
时间: 2023-09-29 21:11:01 浏览: 175
在 Java 中,如果要使用 Mockito 来 mock 同一个对象属性中嵌套相同的对象多次,可以使用 `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` 方法中记录当前调用的次数,并从返回值列表中取出相应的值返回,这样才能模拟多次调用返回不同的值。
阅读全文