Java Mocking神器 | Mockito测试框架的一些实践体会

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

配景:Mockito是一个Java单元测试开辟框架。在写测试单元时它可以Mock(模仿)开辟中一些未完成的接口或者网络断开、数据库连接错误等方法调用。Mockito 的可读性非常好,不会让你感到迷惑,产生的验证错误也很明确。以下为作者的一些使用体会,供大家参考。
Mockito是一个盛行的Java测试框架,开辟职员通过它能够为单元测试创建模仿对象,通过模仿外部依赖关系的举动,使得单独测试单个组件成为大概。这对于测试复杂的系统特别有用,特别是那些外部依赖的举动是不可预测的或难以控制的系统。
使用模仿对象举行隔离测试
使用Mockito的第一步是为代码中的依赖关系创建模仿对象。通过隔离测试每个单元,可以直接验证它而不依赖于外部依赖。这使得在开辟过程的早期辨认和修复任何问题变得更加轻易。
验证举动,而不是实现
当测试一个方法时,重要的是关注该方法的举动,而不是实在现细节。这有助于确保测试的结实性和可维护性,同时也更轻易在不影响测试的情况下对实现举行修改。
使用ArgumentCaptor举行复杂的参数匹配
ArgumentCaptor是Mockito的一个强盛的功能,能够以一种更灵活和可读的方式捕捉和验证方法参数。这在测试复杂参数的方法时特别有用,比如聚集或自界说对象。
使用thenCallRealMethod
thenCallRealMethod()是Mockito的一个功能,它允许调用一个方法的真正实现,而不是模仿的版本。虽然这在某些情况下很有用,但要审慎使用这个功能,虽然在肯定程度测试更加连贯,但也更难明确。
使用注解,如@Mock和@InjectMocks
Mockito提供了几个注解,如@Mock和@InjectMocks,可以让创建和注入模仿对象到你的测试中更加轻易。通过使用这些注解,可以减少设置测试所需的模板代码量,并使测试更具可读性。
制止使用reset()
Reset是Mockito的一个功能,它可以让你清除一个模仿对象的状态。虽然这在某些情况下是有用的,但重要的是要审慎使用它,因为它可以使测试变得脆弱和难以明确。一个更好的方法是使用像@Before如许的注解,在每次测试前创建一个新的模仿对象。
代码示例
这里有一个代码例子,演示了一些使用Mockito的实践。
  1. import static org.mockito.Mockito.*;
  2. import org.junit.Before;
  3. import org.junit.Test;
  4. import org.mockito.ArgumentCaptor;
  5. import org.mockito.Captor;
  6. import org.mockito.InjectMocks;
  7. import org.mockito.Mock;
  8. import org.mockito.MockitoAnnotations;
  9. public class ExampleTest {
  10.    @Mock
  11.    private Dependency dependency;
  12.    @InjectMocks
  13.    private Service service;
  14.    @Captor
  15.    private ArgumentCaptor<String> argumentCaptor;
  16.    
  17.    @Before
  18.    public void setup() {
  19.       MockitoAnnotations.initMocks(this);
  20.    }
  21.    @Test
  22.    public void testService() {
  23.       // arrange
  24.       when(dependency.doSomething("input")).thenReturn("output");
  25.       
  26.       // act
  27.       String result = service.useDependency("input");
  28.       
  29.       // assert
  30.       verify(dependency).doSomething(argumentCaptor.capture());
  31.       assertEquals("input", argumentCaptor.getValue());
  32.       assertEquals("output", result);
  33.    }
  34. }
复制代码
在这个例子中,使用@Mock注解来为Dependency类创建一个模仿对象。使用@InjectMocks注解来将模仿对象注入到服务类的实例中,可以单独地测试服务类,而非必须依赖类的举动。
我们还使用@Captor注解来创建一个ArgumentCaptor对象,可以捕捉并验证传递给Dependency类的doSomething方法的参数。与使用eq或其他参数匹配器相比,这是一种更加灵活和可读的方式来测试传递给方法的参数。
在testService方法中,使用when方法来实现doSomething方法的模仿和被调用时的返回结果。还使用验证方法来验证doSomething方法是用预期的参数调用的。最后,使用 assertEquals 方法来验证 useDependency 方法的结果。
总结

Mockito是一个强盛的Java测试框架,它能够让开辟者给单元测试创建模仿对象。通过遵循好的实践履历,可以确保测试是结实的、可维护的,并且易于明确。无论你是在测试复杂的系统照旧简单的组件,Mockito都可以资助你验证代码的举动,并在开辟过程中及早发现任何问题。
最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战堆栈,这个堆栈也伴随上万个测试工程师们走过最艰巨的路程,希望也能资助到你!
  1. 软件测试技术交流群社:786229024(里面还有工作内推机会,毕竟我们是关系社会。)
复制代码
软件测试面试文档

我们学习肯定是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满足的工作。

面试文档获取方式:




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表