gpt4 book ai didi

testing - 我们什么时候应该使用@InjectMocks?

转载 作者:行者123 更新时间:2023-11-28 19:52:10 26 4
gpt4 key购买 nike

我已经阅读了很多关于@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

最佳答案

如果不提供进一步的代码,您的实际问题将无法得到解答(您显示的代码无法解释您声称观察到的结果)。

关于潜在的问题:您可能不应该使用@InjectMocks;它的核心问题之一是:如果注入(inject)失败,Mockito 不会向您报告错误。

换句话说:你已经通过了单元测试,但是关于某个字段的一些内部细节发生了变化……你的单元测试失败了;但是你不知道为什么......因为模拟框架没有告诉你将模拟插入被测类的“初始”步骤突然失败了。参见 here进一步阅读。

但这里要明确一点:最后,这几乎是一个纯粹的风格问题。习惯@InjectMocks 的人会喜欢它;其他人确实反对。意思是:没有明确的证据表明你是否应该使用这个概念。相反:您研究概念,理解概念,然后您(以及与您一起工作的团队)有意识地决定是否想要使用此注释。

编辑:我想我现在明白你的问题了。 @InjectMocks 的想法是将模拟对象注入(inject)一些被测对象

但是:在这两种情况下,您都是手动做的:

 service.setUserDao(dao);

意思是:如果注入(inject)工作正常(并且不存在 Mockito 未报告的问题),那么使用该注释的示例应该工作你删除那一行。而没有@InjectMocks 的测试用例应该失败没有那一行!

换句话说:您的测试用例都通过了,因为您的代码进行了“手动注入(inject)”!

关于testing - 我们什么时候应该使用@InjectMocks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com