Mockito详解

简述

  Mockito为测试创建test double,即测试替身。

  我们进行测试的时候,很多情况下我们测试的区域会依赖很多外部库,这时就需要测试替身,模拟外部库的返回值,让我们专注于我们要测试的内容。

常用注解和用法

@ExtendWith(MockitoExtension.class)

  使用 @ExtendWith(MockitoExtension.class)开启对Mockito的支持

@Mock

  @Mock注解标注在我们想要创建测试替身的成员变量上,本质上会创建一个子类,所有方法返回值为null

@InjectMocks

  @InjectMocks注解会帮我们把该成员构造好,使用的是@Mock注解生成的测试替身类

Mockito.when()

  Mockito.when()方法会指定测试替身具体方法的返回值,达到模拟外部依赖返回值的作用

Mockito.verify()

  Mockito.verify()检查参数里的类的方法是否被调用

实例

  例如这里我们想测试的是UserService,我们想创建的测试替身是UserRepository

  我们使用@Mock注解创建了一个UserRepository的替身,该对象的所有方法都会返回默认值

  我们使用Mockito.when()方法,指定userRepository.findOneById(id)的返回值是Optional.ofNullable(buildUser()),这个操作被称为stub,打桩

  使用Mockito.verify(),检查userRepository的findOneById(id)是否被调用

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    //本质上就是帮我们new了一个UserRepository子类注入进来,里面的所有方法返回值都是默认值
    @Mock
    private UserRepository userRepository;

    //会自动检索@Mock标注的类,作为参数传入构造方法
    @InjectMocks
    private UserService userService;

    @Test
    void testing_with_mockito_injection() {
        final var id = 123L;
        when(userRepository.findOneById(id)).thenReturn(Optional.ofNullable(buildUser()));
        User user = userService.findById(id);
        assertThat(user.getId()).isEqualTo(id);
        Mockito.verify(userRepository).findOneById(id);
    }

    User buildUser() {
        return User.builder()
                .id(123L)
                .name("Panda")
                .age(24L)
                .avatar("http://...")
                .description("A good guy.")
                .build();
    }
}

参数匹配器

  在打桩的时候,如果该打桩方法有参数,真实运行的时候会比较现在打桩的参数和执行的时候的参数是否一致,一致才提供打桩方法实现

  在verify的时候,如果该方法有参数,mockito会比较我们真实传的参数和现在测试提供的参数是否一致

  这里的一致是指相等,对于普通类型来说就是值相等,对于对象来说就是用equal进行比较,没有实现的话比较的就是地址

  对于打桩,想模拟给定类型的任何参数的行为,我们就能使用ArgumentMatchers类提供的一些静态方法

使用ArgumentMatchers指定打桩需要的参数条件

    

 

posted @ 2022-12-24 00:47  艾尔夏尔-Layton  阅读(588)  评论(0编辑  收藏  举报