Mockito详细教程

前言

单元测试(UT)
工作一段时间后,才真正意识到代码质量的重要性。虽然囫囵吞枣式地开发,表面上看来速度很快,但是给后续的维护与拓展制造了很多隐患。
作为一个想专业但还不专业的程序员,通过构建覆盖率比较高的单元测试用例,可以比较显著地提高代码质量。如后续需求变更、版本迭代时,重新跑一次单元测试即可校验自己的改动是否正确。

Mockito和单元测试有什么关系?
与集成测试将系统作为一个整体测试不同,单元测试更应该专注于某个类。所以当被测试类与外部类有依赖的时候,尤其是与数据库相关的这种费时且有状态的类,很难做单元测试。但好在可以通过“Mockito”这种仿真框架来模拟这些比较费时的类,从而专注于测试某个类内部的逻辑。

SpringBoot与Mockito

spring-boot-starter-test中已经加入了Mockito依赖,所以我们无需手动引入。
另外要注意一点,在SpringBoot环境下,我们可能会用@SpringBootTest注解。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ExtendWith({SpringExtension.class})
public @interface SpringBootTest {

如果用这个注解,跑单元测试的时候会加载SpringBoot的上下文,初始化Spring容器一次,显得格外的慢,这可能也是很多人放弃在Spring环境下使用单元测试的原因之一。
不过我们可以不用这个Spring环境,单元测试的目的应该是只测试这一个函数的逻辑正确性,某些容器中的相关依赖可以通过Mockito仿真。

所以我们可以直接拓展自MockitoExtendsion,这样跑测试就很快了。

@ExtendWith(MockitoExtension.class)
public class ListMockTest {
}

基本使用

mock与verify

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.List;

import static org.mockito.Mockito.*;


@ExtendWith(MockitoExtension.class)
public class ListMockTest {

    @Test
    public void mockList() {
        List mockedList  = mock(List.class);

        mockedList.add("one");
        mockedList.clear();

        verify(mockedList).add("one");
        verify(mockedList).clear();
    }
}

mock(List.class)会返回一个List的仿真对象,可以理解为“假对象”,要与后面提到的spy 区分开。
通过Mockito的verify来验证是否调用过List的add方法。

stubbing(存根)

什么是存根

注意:mocking和stubbing背后的理论很庞大。这里的解释只是针对于这个框架而言,比较粗浅。
上面通过mock函数得到了一个代理对象,调用这个对象的函数时,如果有返回值,默认情况下返回值都是null,如果基本类型,默认值是0或者false。

  @Test
    public void mockList() {
        List mockedList  = mock(List.class);

        System.out.println(mockedList.get(0));
    }

控制台输出

null

当测试的单元依赖这个mock对象的返回值时,我们可以通过提前申明这个函数的返回值来测试各种各样的场景。
提前申明的这个过程被称为存根。

@ExtendWith(MockitoExtension.class)
public class ListMockTest {

    @Test
    public void mockList() {
        List mockedList  = mock(List.class);

        //调用get(0)时,返回first
        when(mockedList.get(0)).thenReturn("first");
        //调用get(1)时,直接抛出异常
        when(mockedList.get(1)).thenThrow(new RuntimeException());

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,Mockito是一个流行的Java单元测试框架,用于创建和测试Java代码中的模拟对象。它使用简单的语法和强大的功能来帮助您测试Java代码。 以下是一份简短的Mockito教程,涵盖了Mockito的一些基本功能: 1. 安装Mockito:在您的项目中使用Mockito,您需要将其添加为依赖项。在Maven项目中,您可以通过将以下依赖项添加到您的pom.xml文件中来安装Mockito: ``` <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.23.4</version> <scope>test</scope> </dependency> ``` 2. 创建模拟:使用Mockito创建模拟对象非常简单。只需调用Mockito的mock()方法即可创建模拟对象。例如,假设您想要创建一个List接口的模拟对象,可以这样做: ``` List<String> mockList = mock(List.class); ``` 3. 设置预期行为:您可以使用Mockito的when()方法来设置模拟对象的预期行为。例如,假设您希望在调用mockList的get()方法时返回一个特定的值,可以这样做: ``` when(mockList.get(0)).thenReturn("first value"); ``` 4. 验证行为:您可以使用Mockito的verify()方法来验证模拟 ### 回答2: 是的,Mockito是一个用于Java的流行的mocking框架。Mockito框架可以让开发者轻松地创建和管理测试中的模拟对象,从而使单元测试更加简洁和可靠。 Mockito框架提供了一套简单而强大的API,用于创建和操作模拟对象。使用Mockito,您可以模拟依赖关系的行为,以便更轻松地编写单元测试Mockito还提供了丰富的方法和功能,用于验证模拟对象的交互和调用。 Mockito框架的官方网站上有详细教程和文档,您可以通过访问https://site.mockito.org/来获取最新的教程和指南。在官方网站上,您可以找到关于Mockito的入门教程、高级用法、示例代码等资源。此外,还有一些社区编写的博客和教程,可以帮助您更深入地了解如何使用Mockito。 如果您需要教程详细副本,我建议您下载Mockito的官方文档或购买一本相关书籍。这些资源将会提供更全面的指导,帮助您充分掌握和应用Mockito框架。最重要的是,通过实践和阅读实际案例,您将能够更好地理解和应用Mockito的各种功能和技术。 ### 回答3: Mockito是一个流行的Java测试框架,用于创建和管理模拟对象以进行单元测试Mockito框架的教程可以在许多地方找到,包括官方网站、在线教程和书籍。以下是一份简短的Mockito框架教程: 1. 官方网站:你可以访问Mockito的官方网站(https://site.mockito.org/)获取关于框架的详细信息和文档。官方网站提供了完整的教程、示例代码、API文档以及常见问题解答等资源。 2. 在线教程:许多网站提供关于Mockito框架的在线教程,其中一些是免费的。你可以通过搜索“Mockito教程”来找到这些资源。一些知名的在线教程网站还提供了互动实例,让你可以在线尝试Mockito框架的用法。 3. 书籍:还有一些书籍专门介绍和讲解Mockito框架的使用。其中一本经典的书籍是《Mockito Cookbook》。这本书提供了丰富的示例代码和解释,适合想深入学习Mockito框架的人。 总之,Mockito框架的教程资源很丰富,你可以根据自己的需求选择合适的学习方式。无论是官方网站、在线教程还是书籍,它们都是学习和掌握Mockito框架的好帮手。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值