junit测试类怎么写 mock,junit和mockito用法区别

  junit测试类怎么写 mock,junit和mockito用法区别

  1.引言我相信做过开发的同学或多或少都写过以下代码。很长一段时间,我一直以为这是单元测试。

  @SpringBootTest

  @RunWith(SpringRunner.class)

  公共类UnitTest1 {

  @自动连线

  private UnitService unitService

  @测试

  公共无效测试(){

  system . out . println(-);

  system . out . println(unitservice . say hello());

  system . out . println(-);

  }

  }但这是单元测试吗?在unitService中也可以依赖Dao的操作;如果是微服务的话,可能要成立一个注册中心。那么这个“单位”就太大了!如果称之为集成测试更合适的话,是否有可能以最小的粒度进行单元测试?

  单元测试应该是带隔离的功能测试。在单元测试中,要尽量避免其他类或系统的副作用。

  一个单元的目标是一小段代码,比如一个方法或者一个类。方法或类的外部依赖关系应该从单元测试中移除,并由测试框架创建的模拟对象代替。

  单元测试一般由开发人员编写,通过验证或断言目标的某些行为或状态来达到测试的目的。

  二。JUnit框架JUnit是一个测试框架,它使用注释来识别测试方法。JUnit是一个托管在Github上的开源项目。

  JUnit测试是指包含在测试类中的方法。要将一个方法定义为测试方法,请用@Test注释来标记它。这个方法执行被测代码,JUnit或另一个assert框架提供的Assert方法可以用来检查预期结果与实际结果是否一致。这些方法调用通常被称为断言或断言语句。

  公共类UnitTest2 {

  @测试

  公共无效测试(){

  String sayHello= Hello World

  assert . assert equals( Hello World ,say Hello);

  }

  }以下是一些常用的JUnit注释:

  以下是一些常用的Assert断言:

  3.从上面的介绍中我们可以认识到,如何减少对外部的依赖是实践单元测试的关键。这正是Mockito的使命,它是一个流行的Mockito框架,可以与JUnit结合使用。Mockito允许我们创建和配置mock对象,使用Mockito将大大简化具有外部依赖的类的测试和开发。Mockito默认集成在spring-boot-starter-test中,不需要额外介绍。

  在测试中使用Mockito通常:

  模仿外部依赖并将模仿对象插入到待测试代码中来执行待测试代码,以验证代码是否被正确执行。

  3.1使用Mockito创建模拟对象Mockito提供了几种创建模拟对象的方法:

  使用静态mock()方法来使用@Mock注释。如果使用@Mock注释,则必须用@Mock注释触发对象的创建。您可以使用MockitoRule来实现这一点,它通过调用静态方法mockitoanannotations . init mocks(this)用@Mock注释填充字段。或者可以使用@ run with(mockitojunitrunner . class)。

  公共类UnitTest3 {

  //用@Mock批注触发对象的创建

  @ Rule public mockito Rule mockito Rule=mockito JUnit . Rule();

  //1\.用@Mock注释创建一个模拟对象。

  @模拟私人UnitDao unitDao

  @测试

  公共无效测试(){

  //2\.使用静态mock()方法创建一个模拟对象

  迭代器iterator=mock(iterator . class);

  //何时.然后回来/一定要回来.当模拟依赖调用时。

  when(iterator.next())。然后返回( hello );

  多雷特纳。当(unitDao)。delete(any long());

  //断言

  Assert.assertEquals(hello ,iterator . next());

  Assert.assertEquals(新整数(1),unit Dao . delete(1L));

  }

  }3.2用模拟对象练习单元测试。我们要进行单元测试的内容往往包括对数据库的访问等。那么,我们如何模拟这部分通话呢?我们可以使用@Injectmocks注释来创建实例,并使用模拟对象进行依赖注入。

  @服务

  公共类UnitServiceImpl实现UnitService {

  @自动连线

  私有UnitDao unitDao

  @覆盖

  公共字符串sayHello(){

  integer delete=unit Dao . delete(1L);

  System.out.println(删除);

  返回“hello unit”;

  }

  } @与(mockitojunitrunner一起运行。类)

  公共类单元测试2 {

  @Mock

  私有统一道

  @InjectMocks

  private UnitServiceImpl unitService;

  @测试

  public void unitTest(){

  //模仿调用

  when(unitDao.delete(anyLong())).然后返回(1);

  Assert.assertEquals(hello unit ,unitservice)。问好());

  }

  }Mockito还有很多有趣的实践,比如:@间谍或间谍()方法、验证()验证等等,鉴于篇幅原因,读者可自行挖掘。

  3.3 使用PowerMock模拟静态方法莫奇托。也有一些局限性。例如:不能模拟的静态方法和私有方法。有关详细信息,请参阅莫奇托限制的常见问题解答。这个时候我们就要用到力量模拟,力量模拟支持单元测试和TestNG,扩展了静态导入和莫奇托框架,增加了模拟静态、最终方法的功能。

  首先需要引入PowerMock的依赖:

  !- PowerMock -

  属国

  groupId org.powermock /groupId

  神器id异能模拟-模块-junit4 /artifactId

  版本2 .0 .7/版本

  范围测试/范围

  /依赖关系

  属国

  groupId org.powermock /groupId

  工件id power mock-API-mock ito2/工件id

  版本2 .0 .7/版本

  /依赖关系接下来就能愉快的模拟的静态方法了。

  @RunWith(PowerMockRunner.class)

  @ prepare fortest({ string utils。class })

  公共类单元测试4 {

  @测试

  公共无效测试(){

  模拟静态(字符串实用程序。类);

  when(字符串实用程序。获取文件名(任意字符串()).然后返回( localhost );

  Assert.assertEquals(localhost ,string utils。获取文件名();

  }

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: