Mockito模拟指南

我们遇到的大多数类都具有依赖关系,并且通常情况下,方法将一些工作委派给其他类中的其他方法。这些类是我们的依赖项。在对这些方法进行单元测试时,如果仅使用JUnit,我们的测试也将依赖于这些方法。我们希望单元测试独立于所有其他依赖项。
假设我们要测试的方法 addCustomer 在 CustomerService 类中,这中 addCustomer 方法的的保存方法 CustomerDao 被调用的类。由于CustomerDao save() 某些原因,我们不想调用该方法的实际实现 :
o我们只想测试addCustomer() 隔离内部的逻辑 。
o我们可能尚未实施。
oaddCustomer() 如果中的save() 方法 存在缺陷,我们不希望单元测试 失败 CustomerDao。
因此,我们应该以某种方式模拟依赖项的行为。这就是模拟框架起作用的地方。
我只是用Mockito来做这个,在这篇文章中,我们将看到如何有效地使用Mockito模拟那些依赖关系。
如果您不熟悉使用JUnit进行单元测试,请查阅我的早期文章“ 如何使用JUnit编写出色的单元测试”。
什么是Mockito?
Mockito是一个非常不错的模拟框架。它使您可以使用干净简单的API编写漂亮的测试。Mockito不会给您带来麻烦,因为测试的可读性很强,并且会产生清晰的验证错误。
— “ Mockito。” Mockito框架站点。Np,网络。2017年4月28日。
用Mockito注射cks头
因此,回到上面的示例,我们如何使用Mockito模拟依赖关系?好吧,我们可以在运行测试时将模拟注入到要测试的类中,而不是真正的实现中!
让我们看一个受测试类的示例,它依赖于 CustomerDao:
public class CustomerService {
@Inject
private CustomerDao customerDao;
public boolean addCustomer(Customer customer){
if(customerDao.exists(customer.getPhone())){
return false;
}
return customerDao.save(customer);
}
public CustomerDao getCustomerDao() {
return customerDao;
}
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
}

以下是使用Mockito模拟依赖项的测试:
public class CustomerServiceTest {
@Mock
private CustomerDao daoMock;
@InjectMocks
private CustomerService service;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
//assertion here
}
}

让我们看一下上面示例中注释的作用。
@Mock 将为 CustomerDao
@InjectMocks@Mock 创建实例时, 会将标有标记的模拟物注入 该实例。
那么 什么时候 或 在哪里 创建这些实例?好吧,这是在setUp方法中的这一行完成的:
MockitoAnnotations.initMocks(this);
因此,将在此测试类的每个测试方法的开始处创建这些实例。
Mockito的模拟方法
大!现在我们已经成功创建并注入了模拟,现在我们应该告诉模拟在调用某些方法时如何表现。
该 when then 模式:
我们在每种测试方法中都这样做。以下代码行告诉Mockito框架,我们希望save() 模拟DAO实例的 方法在传入特定客户实例时返回true。
wh

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值