Mockito框架抛出NullPointerException
首先看一下Mockito框架是怎么抛出NullPointerException
比如下面的代码
Company类
package com.one.util; import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Company { private String name; public String companyList(List<Company> companies){ return companies.get(0).getName(); } }
Person类如下
package com.one.util; import java.util.ArrayList; import java.util.List; import lombok.Data; @Data public class Person { private Company company; public Person(Company company) { this.company = company; } public String test1() { List companyList = new ArrayList<Company>(); companyList.add(company); return this.test2(company.companyList(companyList)); } public String test2(String name) { return name.toString(); } }
PersonTest 测试类代码如下
package com.one.util; import java.util.ArrayList; import java.util.List; import org.assertj.core.api.Assertions; import org.assertj.core.util.Lists; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class PersonTest { @Mock private Company company; private Person person; @Before public void setUp(){ person = new Person(company); } @Test public void show() { List<Company> companies = Lists.newArrayList(); Mockito.when(company.companyList(companies)).thenReturn("hello"); String s = person.test1(); Assertions.assertThat(s).isEqualTo("hello"); } }
然后执行上面的测试方法show(),此时结果就会抛出空指针异常了,这是什么原因呢,我么往下看
分析上面为什么抛出NullPointerException
这是因为你的测试方法show()方法里面的Mockito.when(company.companyList(companies)).thenReturn("hello")里面的变量companies变量的地址和真正执行到Company类里面的companyList方法里面的companies参数变量的地址是不一样的,所以真正执行的时候,调用Mockito.when(company.companyList(companies)).thenReturn("hello")返回的就是null
就比如下面的companies的变量是OX001
然后当真正执行到Company类里面的companyList()方法的时候,因为test1()方法里面有重新new了一个集合当成companyList()方法的参数,此时test1()方法里面又重新new的集合companyList变量的地址就会是OX003,
然后因为show()测试方法里面companies变量的地址和test1()方法里面的new的companyList变量的地址是不同的,所以show()方法里面的Mockito.when(company.companyList(companies)).thenReturn("hello")是执行不成功的,然后就会返回null,然后因为在test1()方法里面调用test2()方法,所以此时就会抛出空指针
怎么解决这个问题呢
使用Mockito.any()就可以了
比如下面的代码
Company类
package com.one.util; import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Company { private String name; public String companyList(List<Company> companies){ return companies.get(0).getName(); } }
Person类如下
package com.one.util; import java.util.ArrayList; import java.util.List; import lombok.Data; @Data public class Person { private Company company; public Person(Company company) { this.company = company; } public String test1() { List companyList = new ArrayList<Company>(); companyList.add(company); return this.test2(company.companyList(companyList)); } public String test2(String name) { return name.toString(); } }
PersonTest 测试类代码如下,此时Mockito.when(company.companyList(any())).thenReturn("hello")里面使用的就是any()
package com.one.util; import java.util.ArrayList; import java.util.List; import org.assertj.core.api.Assertions; import org.assertj.core.util.Lists; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import static org.mockito.Matchers.any; @RunWith(MockitoJUnitRunner.class) public class PersonTest { @Mock private Company company; private Person person; @Before public void setUp(){ person = new Person(company); } @Test public void show() { List<Company> companies = Lists.newArrayList(); Mockito.when(company.companyList(any())).thenReturn("hello"); String s = person.test1(); Assertions.assertThat(s).isEqualTo("hello"); } }
此时结果如下所示,成功了
能看到这里的同学,就帮忙右上角点个赞吧,Thanks(・ω・)ノ
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java中的各种锁详细介绍
java中的各种锁详细介绍转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。 Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录: 乐观锁 VS 悲观锁#乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。 先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这...
- 下一篇
SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务
一、AOP切面编程 1、什么是AOP编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 2、AOP编程特点 1)AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 2)经典应用:事务管理、性能监视、安全检查、缓存 、日志等 3)aop底层将采用代理机制进行实现 4)接口 + 实现类 :spring采用 jdk 的动态代理Proxy 5)实现类:spring 采用 cglib字节码增强 3、AOP中术语和图解 1)target:目标类 需要被代理的类。例如:UserService 2)Joinpoint:连接点 所谓连接点是指那些可能被拦截到的方法。例如:所有的方法 3)PointCut:切入点 已经被增强的连接点...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程