mockito的详细使用

简介: 1.概述mock,一种JAVA单元测试技术,mock允许使用模拟对象替换测试中的系统部件,并断言它们是如何被使用的一项技术。当某个接口或者功能模块依赖于其他接口或者模块,而所依赖的模块或接口未开发完毕,可以使用mock模拟依赖的模块。mockito,JAVA单元测试中使用频率最高的mock框架之一。mock遵循流程:输入—期望—验证

1.概述

mock,一种JAVA单元测试技术,mock允许使用模拟对象替换测试中的系统部件,并断言它们是如何被使用的一项技术。

当某个接口或者功能模块依赖于其他接口或者模块,而所依赖的模块或接口未开发完毕,可以使用mock模拟依赖的模块。

mockito,JAVA单元测试中使用频率最高的mock框架之一。

mock遵循流程:输入—期望—验证

2.使用

2.1.依赖

注释:博主用的3.8.0,具体版本号有哪些可以去maven repository上查。

<dependency>

    <groupId>org.mockito</groupId>

    <artifactId>mockito-core</artifactId>

    <version>${version}</version>

    <scope>test</scope>

</dependency>

2.2.校验

2.2.1.值校验

校验值是否是期待值。

178599ecc713438493a2591bfc55ad8e.png

2.2.2.顺序校验

inOrder可以校验方法的调用顺序是否是按照之前的调用顺序。

2849a9e88e274f04939d359943d85c0b.png

2.2.3.指定返回

指定返回值是mock的最大价值也是最常用的,指定返回值可以用来伪造一个假的返回值,从而绕过对于真实对象的调用。如果真实对象的调用很复杂,入参或者调用条件很苛刻,那么直接用mock的指定返回功能绕过即可,这是很有价值的。

439453fa27a64f88a2be2841a01b7680.png

注意:

mock只是生成了一个壳子,不是真的创建了一个对象,无法进行状态的维护,需要对每个行为对应的属性都要进行自定义,如以下代码即使调用了set方法,也不会为属性赋值,属性仍然为null。

@Test
public void test(){
  Person mockPerson=Mockito.mock(Person.class);
    mockPerson.setName("bugMan");
    assert mockPerson.getName()==null:"name属性值为空";
}

2.3.注解

除了编码的方式外,还提供了注解方式进行使用,从而使代码变得更加简洁。

2.3.1.@Mock

@Mock和Mockito.mock()功能相同。

@Mock
HashMap<String, Integer> mockHashMap;
@Test
public void saveTest()
{
    //输入
    mockHashMap.put("A", 1);
  //期望
    Mockito.verify(mockHashMap).put("A", 1);
    assert mockHashMap.size()==0;
}

2.3.2.@Spy

@Spy和@Mock不同的是@Mock创建的是个壳子,而@Spy创建的真的是个对象,可以进行状态维护。

@Spy
HashMap<String, String> hashMap;
@Test
public void saveTest()
{
  //输入
    hashMap.put("name", "bugMan");
  //期望
    Mockito.verify(hashMap).put("name", "bugMan");
    assert hashMap.size()==1;
}

2.3.3.@Captor

@Captor注释用于创建ArgumentCaptor对象,该类型的对象可以用来捕获参数。

@Mock
HashMap<String, String> hashMap;
@Captor
ArgumentCaptor<String> keyCaptor;
@Captor
ArgumentCaptor<String> valueCaptor;
@Test
public void saveTest() 
{
    hashMap.put("name", "bugMan");
    Mockito.verify(hashMap).put(keyCaptor.capture(), valueCaptor.capture());
    assert "name".equals(keyCaptor.getValue());
    assert "bugMan".equals(valueCaptor.getValue());
}

2.3.4.@InjectMocks

@InjectMocks用来进行@Mock的注入,目的就是去掉手动注入,让代码变得简洁。

以一个service层注入dao层的操作为例:

dao层:

@Repository
public class MyRepository {
    public void doSomething() {
        System.out.println("here's dosomething");
    }
    public Model findById(Long id) {
        return new Model(id, "Real Repository");
    }
}

service层:

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;
    public void doSomething() {
        this.myRepository.doSomething();
    }
    public Model findById(Long id) {
        return this.myRepository.findById(id);
    }
}

没有@InjectMocks的话,需要手动注入:

MyRepository myRepository = Mockito.mock(MyRepository.class); 
MyService myService = new MyService(myRepository);

有@InjectMocks的话直接声明即可,@Mock注解的对象会自动注入进@InjectMocks注解的对象:

  @Mock
    private MyRepository myRepository;
    @InjectMocks
    private MyService myService;
    @Test
    public void testInjectMocks() {
        System.out.println(myService.getMyRepository().getClass());
    }


目录
相关文章
|
IDE Java 测试技术
Mockito 应用指南
Mockito 是一个针对 Java 的 mock 框架。
|
5月前
|
Java 测试技术 持续交付
Springboot中JUNIT5单元测试+Mockito详解
Springboot中JUNIT5单元测试+Mockito详解
643 1
|
Java 测试技术 Spring
Mockito + Junit + SpringBoot进行单元测试
Mockito + Junit + SpringBoot进行单元测试
252 0
|
监控 Java 测试技术
Mockito教程
Mockito教程
1975 0
Mockito教程
|
Go Java
mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。   为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。
4138 1
|
Java 测试技术 Maven
PowerMock+Junit的使用
今天使用PowerMock进行单元测试,
150 0
|
测试技术 容器 API
JUnit + Mockito 单元测试(二)
JUnit 是单元测试框架。Mockito 与 JUnit 不同,并不是单元测试框架(这方面 JUnit 已经足够好了),它是用于生成模拟对象或者直接点说,就是”假对象“的工具。两者定位不同,所以一般通常的做法就是联合 JUnit + Mockito 来进行测试。
2099 0
|
测试技术 API
Mockito 一个优秀的 Mock 测试框架
Hello 大家好,我是阿粉,日常工作中很多时候我们都需要同事间的相互配合协作完成某些功能,所以我们经常会遇到服务或者应用内不同模块之间要互相依赖的场景。比如下面的场景,serviceA 中的 methodA() 方式依赖 serviceB 中的 methodB() 方法返回操作的结果。那如果我们要对自己的methodA() 方法进行编写单元测试,还需要等其他同事的methodB() 方法开发完成才行。那有没有什么办法我们可以跳过或者说模拟方法 B 的输出呢?这就引出了我们今天的主角 Mockito,一个优秀的 Mock 测试框架。
Mockito 一个优秀的 Mock 测试框架
|
Java 数据库连接 测试技术
【mockito】单元测试之mockito简单使用
项目使用的是springmvc+mybatis 开发; mock包为 mockito-all;虽然也引用了powermock,但截至目前,还未使用到;如果使用到后续再补相关笔记。