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

背景:Mockito是一个Java单元测试开发框架。在写测试单元时它可以Mock(模拟)开发中一些未完成的接口或者网络断开、数据库连接错误等方法调用。Mockito 的可读性非常好,不会让你感到迷惑,产生的验证错误也很明确。以下为作者的一些使用体会,供大家参考。

Mockito是一个流行的Java测试框架,开发人员通过它能够为单元测试创建模拟对象,通过模拟外部依赖关系的行为,使得单独测试单个组件成为可能。这对于测试复杂的系统特别有用,特别是那些外部依赖的行为是不可预测的或难以控制的系统。

使用模拟对象进行隔离测试

使用Mockito的第一步是为代码中的依赖关系创建模拟对象。通过隔离测试每个单元,可以直接验证它而不依赖于外部依赖。这使得在开发过程的早期识别和修复任何问题变得更加容易。

验证行为,而不是实现

当测试一个方法时,重要的是关注该方法的行为,而不是其实现细节。这有助于确保测试的健壮性和可维护性,同时也更容易在不影响测试的情况下对实现进行修改。

使用ArgumentCaptor进行复杂的参数匹配

ArgumentCaptor是Mockito的一个强大的功能,能够以一种更灵活和可读的方式捕获和验证方法参数。这在测试复杂参数的方法时特别有用,比如集合或自定义对象。

使用thenCallRealMethod

thenCallRealMethod()是Mockito的一个功能,它允许调用一个方法的真正实现,而不是模拟的版本。虽然这在某些情况下很有用,但要谨慎使用这个功能,虽然在一定程度测试更加连贯,但也更难理解。

使用注解,如@Mock和@InjectMocks

Mockito提供了几个注解,如@Mock和@InjectMocks,可以让创建和注入模拟对象到你的测试中更加容易。通过使用这些注解,可以减少设置测试所需的模板代码量,并使测试更具可读性。

避免使用reset()

Reset是Mockito的一个功能,它可以让你清除一个模拟对象的状态。虽然这在某些情况下是有用的,但重要的是要谨慎使用它,因为它可以使测试变得脆弱和难以理解。一个更好的方法是使用像@Before这样的注解,在每次测试前创建一个新的模拟对象。

代码示例

这里有一个代码例子,演示了一些使用Mockito的实践。

import static org.mockito.Mockito.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class ExampleTest {

   @Mock
   private Dependency dependency;

   @InjectMocks
   private Service service;

   @Captor
   private ArgumentCaptor<String> argumentCaptor;
   
   @Before
   public void setup() {
      MockitoAnnotations.initMocks(this);
   }

   @Test
   public void testService() {
      // arrange
      when(dependency.doSomething("input")).thenReturn("output");
      
      // act
      String result = service.useDependency("input");
      
      // assert
      verify(dependency).doSomething(argumentCaptor.capture());
      assertEquals("input", argumentCaptor.getValue());
      assertEquals("output", result);
   }
}

在这个例子中,使用@Mock注解来为Dependency类创建一个模拟对象。使用@InjectMocks注解来将模拟对象注入到服务类的实例中,可以单独地测试服务类,而非必须依赖类的行为。

我们还使用@Captor注解来创建一个ArgumentCaptor对象,可以捕获并验证传递给Dependency类的doSomething方法的参数。与使用eq或其他参数匹配器相比,这是一种更加灵活和可读的方式来测试传递给方法的参数。

在testService方法中,使用when方法来实现doSomething方法的模拟和被调用时的返回结果。还使用验证方法来验证doSomething方法是用预期的参数调用的。最后,使用 assertEquals 方法来验证 useDependency 方法的结果。

总结

Mockito是一个强大的Java测试框架,它能够让开发者给单元测试创建模拟对象。通过遵循好的实践经验,可以确保测试是健壮的、可维护的,并且易于理解。无论你是在测试复杂的系统还是简单的组件,Mockito都可以帮助你验证代码的行为,并在开发过程中及早发现任何问题。

最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

在这里插入图片描述

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

软件测试技术交流群社:786229024(里面还有工作内推机会,毕竟我们是关系社会。)

软件测试面试文档

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

面试文档获取方式:

猜你喜欢

转载自blog.csdn.net/wx17343624830/article/details/130105189