开发者社区> it乾坤> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Mockito框架抛出NullPointerException

简介: 一文详细讲解Mockito框架是怎么抛出NullPointerException的整个过程和解决方式。
+关注继续查看

首先看一下Mockito框架是怎么抛出NullPointerException

比如下面的代码

20190716183657401

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(),此时结果就会抛出空指针异常了,这是什么原因呢,我么往下看

20190716183937659

分析上面为什么抛出NullPointerException

这是因为你的测试方法show()方法里面的Mockito.when(company.companyList(companies)).thenReturn("hello")里面的变量companies变量的地址和真正执行到Company类里面的companyList方法里面的companies参数变量的地址是不一样的,所以真正执行的时候,调用Mockito.when(company.companyList(companies)).thenReturn("hello")返回的就是null

就比如下面的companies的变量是OX001

20190716185955350

然后当真正执行到Company类里面的companyList()方法的时候,因为test1()方法里面有重新new了一个集合当成companyList()方法的参数,此时test1()方法里面又重新new的集合companyList变量的地址就会是OX003,

20190716185858116
然后因为show()测试方法里面companies变量的地址和test1()方法里面的new的companyList变量的地址是不同的,所以show()方法里面的Mockito.when(company.companyList(companies)).thenReturn("hello")是执行不成功的,然后就会返回null,然后因为在test1()方法里面调用test2()方法,所以此时就会抛出空指针

怎么解决这个问题呢

使用Mockito.any()就可以了
比如下面的代码

20190716183657401

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");
    }
}

此时结果如下所示,成功了

20190716185255749

原文链接

能看到这里的同学,就帮忙右上角点个赞吧,Thanks(・ω・)ノ

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
18、Java——NullPointerException异常的原因和解决办法
18、Java——NullPointerException异常的原因和解决办法
0 0
Java中的异常(抛出异常、自定义异常等)
Java中的异常(抛出异常、自定义异常等)
0 0
Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
JDK1.8开始引入的特性,Optional 类主要解决空指针异常(NullPointerException)问题。 Optional类是一个可能包含或不包含非空值(可以为null)的容器对象。 如果一个值存在,调用 isPresent()方法将返回true、get()方法将返回该对象。 Optional类提供判断空值的方法,使用其中方法可以不用再显式地进行空值检测。
0 0
Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
0 0
Java 8 Optional:优雅地避免 NPE
本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称 NPE)可以说是所有 Java 程序员都遇到过的一个异常,虽然 Java 从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而 Java 设计者也只能是让指针在 Java 语言中变得更加简单易用,而不能完全剔除,所以才有了常见对的关键字 null。
459 0
Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。
926 0
java基础之自定义异常类及throw和throws的区别
一、异常的架构:   Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception。 Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟机错误等,这些异常除了尽力使程序安全退出外,我们并没有办法去解决,所以开发的时候我们更应该关注...
466 0
【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析
异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环。 异常有两个过程,一个是抛出异常;一个是捕捉异常。 抛出异常 抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。
1167 0
Java异常--其他概念—throw、throws、Exception、RuntimeException、断言
<h1>1、throws关键字</h1> <div> <img src="http://img.blog.csdn.net/20131009151636140" alt=""><br> </div> <div> <span style="white-space:pre"></span>假设定义一个除法的方法div(),对于除法来说:有可能出现异常,有可能不出现异常。所以对于这样的方法来
1632 0
+关注
it乾坤
我是一名爱加班的程序猿
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载