添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
千杯不醉的牙膏  ·  PythonException: ...·  46 分钟前    · 
深情的烈酒  ·  WhatsUp Gold Pre-Auth ...·  3 小时前    · 
大力的熊猫  ·  HttpClient.GetAsync ...·  3 小时前    · 
任性的菠菜  ·  Python - ...·  2 周前    · 
悲伤的地瓜  ·  Who is the woman in ...·  2 月前    · 
比如下面的代码 ![在这里插入图片描述](https://itqiankun.oss-cn-beijing.aliyuncs.com/picture/2019-8-4/20190716183657401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4OTQ4MA==,size_16,color_FFFFFF,t_70) Company类 ```shell 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 companies){ return companies.get(0).getName(); Person类如下 ```java 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 (); companyList.add(company); return this.test2(company.companyList(companyList)); public String test2(String name) { return name.toString(); PersonTest 测试类代码如下 ```shell 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 companies = Lists.newArrayList(); Mockito.when(company.companyList(companies)).thenReturn("hello"); String s = person.test1(); Assertions.assertThat(s).isEqualTo("hello"); 然后执行上面的测试方法show(),此时结果就会抛出空指针异常了,这是什么原因呢,我么往下看 ![在这里插入图片描述](https://itqiankun.oss-cn-beijing.aliyuncs.com/picture/2019-8-4/20190716183937659.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4OTQ4MA==,size_16,color_FFFFFF,t_70) ### 分析上面为什么抛出NullPointerException 这是因为你的测试方法show()方法里面的Mockito.when(company.companyList(companies)).thenReturn("hello")里面的变量companies变量的地址和真正执行到Company类里面的companyList方法里面的companies参数变量的地址是不一样的,所以真正执行的时候,调用Mockito.when(company.companyList(companies)).thenReturn("hello")返回的就是null 就比如下面的companies的变量是OX001 ![在这里插入图片描述](https://itqiankun.oss-cn-beijing.aliyuncs.com/picture/2019-8-4/20190716185955350.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4OTQ4MA==,size_16,color_FFFFFF,t_70) 然后当真正执行到Company类里面的companyList()方法的时候,因为test1()方法里面有重新new了一个集合当成companyList()方法的参数,此时test1()方法里面又重新new的集合companyList变量的地址就会是OX003, ![在这里插入图片描述](https://itqiankun.oss-cn-beijing.aliyuncs.com/picture/2019-8-4/20190716185858116.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4OTQ4MA==,size_16,color_FFFFFF,t_70) 然后因为show()测试方法里面companies变量的地址和test1()方法里面的new的companyList变量的地址是不同的,所以show()方法里面的Mockito.when(company.companyList(companies)).thenReturn("hello")是执行不成功的,然后就会返回null,然后因为在test1()方法里面调用test2()方法,所以此时就会抛出空指针 ### 怎么解决这个问题呢 使用Mockito.any()就可以了 比如下面的代码 ![在这里插入图片描述](https://itqiankun.oss-cn-beijing.aliyuncs.com/picture/2019-8-4/20190716183657401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4OTQ4MA==,size_16,color_FFFFFF,t_70) Company类 ```shell 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 companies){ return companies.get(0).getName(); Person类如下 ```java 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 (); 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() ```shell 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 companies = Lists.newArrayList(); Mockito.when(company.companyList(any())).thenReturn("hello"); String s = person.test1(); Assertions.assertThat(s).isEqualTo("hello"); 此时结果如下所示,成功了 ![在这里插入图片描述](https://itqiankun.oss-cn-beijing.aliyuncs.com/picture/2019-8-4/20190716185255749.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4OTQ4MA==,size_16,color_FFFFFF,t_70)