小程序制作搭建,东莞排名seo网站关键词优化,六安论坛招聘网最新招聘,商业空间设计概念方案常用的mock工具mockito
在编写单元测试时#xff0c;需要mock依赖的对象#xff0c;减少依赖对象对测试的影响#xff0c;Mocktio是常用的mock工具之一#xff0c;那么mockito提供了哪些功能呢#xff1f; Mock对象的创建和配置#xff1a;Mockito可以通过简单的语法创建… 常用的mock工具mockito
在编写单元测试时需要mock依赖的对象减少依赖对象对测试的影响Mocktio是常用的mock工具之一那么mockito提供了哪些功能呢 Mock对象的创建和配置Mockito可以通过简单的语法创建mock对象并允许你配置mock对象的行为。 Mock对象的验证Mockito提供了一系列的验证方法可以帮助你验证mock对象的方法是否被正确调用以及调用次数、参数等信息是否符合预期。 Stubbing桩Mockito允许你为mock对象的方法设置返回值或者抛出异常这个过程被称为Stubbing桩。 Spy间谍Mockito允许你创建一个实际的对象但你可以使用Mockito来监控对象的某些行为。 参数匹配器Mockito提供了多种参数匹配器可以帮助你验证mock对象方法的调用是否符合预期。例如any()可以匹配任何参数eq()可以匹配一个指定的值等。 Annotation支持Mockito支持在测试中使用注解来简化mock对象的创建和管理例如Mock和Spy。
下面是一些实际例子通过这些例子可以了解到如何使用Mockito框架来mock方法行为并进行不同目的的验证例如验证方法的返回方法是否被调用过。 除了对返回结果和是否被调用进行测试外还可以测试执行的方法是否超时方法执行顺序等。具体例子如下所示 上面是一个直接mock List class的例子接下来看看mock一个自定义的class。下面的例子中OneClass中依赖TwoClass如果要对OneClass进行测试那么需要Mock TwoClass这个class。除了直接用Mockito.mock(ClassName.class)进行mock外还可以使用注解MockInjectedMock。如下图右图所示
使用InjectMocks注解时Mockito会自动查找并将标记为Mock的对象注入到被测类中从而实现依赖注入。当测试类中需要模拟依赖对象的行为时我们可以使用Mock来创建这些虚拟对象并在测试中定义它们的行为和返回值。所以Mock和InjectMocks一般配合使用这样不用手动将依赖的mock对象设置到被测class的构造函数中或者属性中。除了Mock和InjectMocks注解外在测试class上面还有ExtendWith(MockitoExtension.class)。ExtendWith(MockitoExtension.class)告诉JUnit 5在运行测试时使用MockitoExtension来扩展测试执行环境从而支持Mockito相关的功能例如使用Mock、InjectMocks等注解。如果是Junit4那么使用RunWith(MockitoJUnitRunner.class)。
需要注意一点Mockito是基于动态代理的框架它可以模拟Java接口和普通的类但对于一些特殊类型的类例如静态类、final类和私有构造函数的类Mockito是无法直接进行模拟。如果是3.4.0或者以上版本的mockito可以mock静态class。对于某些特定情况还可以引入powermock来进行mock或者不mock直接使用真实对象。
PowerMock 是一个用于 Java 开发的扩展测试框架可以与 Mockito 集成使用。PowerMock 可以用于 Mockito 无法 Mock 的一些场景例如 静态方法和私有方法的 Mock Final 类和 Final 方法的 Mock 构造函数的Mock 静态初始化块的Mock
在使用powermock时需要注意的是PowerMock 通过使用 Java Instrumentation API 进行字节码操作来实现上述功能因此使用 PowerMock 需要引入一些额外的依赖并且可能会影响测试的性能和稳定性。同时PowerMock 对代码的修改可能会影响代码的可维护性和可读性因此需要谨慎使用。在编写单元测试过程中除了选择合适的工具外还需要解决好单元测试可测性问题。
单元测试可测性问题 代码中存在过多的依赖当代码中存在大量的依赖关系时单元测试变得困难因为要在测试环境中创建和管理所有依赖的对象和资源。此时可以使用依赖注入、抽象工厂等技术来减少依赖关系从而提高代码的可测试性。 代码中存在过多的状态当代码中存在大量的状态时单元测试也变得困难因为需要在测试中管理和维护状态。此时可以使用不可变对象、纯函数等技术来减少状态的影响从而提高代码的可测试性。 代码中存在难以模拟的外部资源当代码中存在难以模拟的外部资源时单元测试也变得困难例如数据库、网络等。此时可以使用测试替身、内存数据库等技术来模拟外部资源从而提高代码的可测试性。更多mocktio工具使用详情信息可查看官网信息。
前面的例子都是比较单一的例子下面给出一个完成的demo来看看如何为里面的class编写单元测试。如下图所示包含repositorymodelserviceutil四部分被测代码PersonService中依赖的对象有PersonRequest,Person,SalaryCalculatehe TimeUtil其中SalaryCalculatehe TimeUtil是静态类。 下面是为PersonalService编写的单元测试可以看到因为PersonRequest对象是model是一个请求对象所以直接用New的方式创建了PersonRequest。对于静态类这里使用了mockStatic方法来模拟。单元测试中测试了if逻辑的两种结果。 再来看看依赖数据库的class如何编写单元测试下面是UserRegistration的代码代码中调用了userRepository classRepository会依赖数据哭。 下面是为UserRegistration方法编写的单元测试也是验证了if逻辑中的两种场景。单元测试中通过Mock模拟了依赖的UserRepository class。 以上就是单元测试的一些基础知识介绍。