【发布时间】:2017-09-13 19:07:56
【问题描述】:
我已经阅读了很多关于@Mock 和@InjectMocks 的讨论,但仍然找不到使用@InjectMocks 的合适或必要的案例。事实上,我不确定当我们使用@InjectMocks 时会发生什么。
考虑以下示例,
public class User {
private String user_name;
private int user_id;
public User(int user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
}
public interface UserDao {
public List<User> getUserList();
}
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public List<User> getUserList() {
return userDao.getUserList();
}
}
这是我的测试课
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
private UserService service = new UserService();
@Mock
private UserDao dao;
@Test
public void testGetUserList() {
service.setUserDao(dao);
// mock the return value of the mock object
List<User> mockResult = Arrays.asList(new User(101),new User(102),new User(103));
when(dao.getUserList()).thenReturn(mockResult);
// check return value is same as mocked value
assertEquals(service.getUserList(),mockResult);
// verify the getUserList() function is called
verify(dao).getUserList();
}
}
测试运行成功,没有错误。 考虑使用@InjectMock 注解的另一种方法。
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@InjectMocks
private UserService service;
@Mock
private UserDao dao;
@Test
public void testGetUserList() {
service.setUserDao(dao);
// mock the return value of the mock object
List<User> mockResult = Arrays.asList(new User(101),new User(102),new User(103));
when(dao.getUserList()).thenReturn(mockResult);
// check return value is same as mocked value
assertEquals(service.getUserList(),mockResult);
// verify the getUserList() function is called
verify(dao).getUserList();
}
}
这同样适用。那么,哪种方式更好呢?有什么最佳做法吗? 顺便说一句,我正在使用 Junit 4.8.1 和 Mockito 1.9.5
【问题讨论】:
-
还有一个提示:请教我正是不是这个网站的内容。下次注意你的措辞!
-
感谢您的及时采纳。我还能做些什么来让我的回答在你眼中也值得投票吗?