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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。