首页 > 解决方案 > 使用“When ... thenReturn”返回的 Mockito 导致 NullPointerException

问题描述

我有一个名为 Person 的第三方类,一种方法是返回一个字符串:

public class Person<T> {
   public String getName(Object<T> obj) {
  // some code here
  return "some string"
}

还有另一个第三方类 SomeClass,一种方法是返回一个 Person 对象:

 public class SomeClass {
   public <T> Person<T> createPerson(Object obj) {
    // some code here
    return new Person<T>(....)
   }
 }

我的类使用上述两个类首先创建一个人,然后获取人名。我无法对 MyClass 进行更改,因为它已成功通过系统测试:

 public class MyClass {

    public String myMethod() {

        Person<T> person = someClass.createPerson(obj);
        return person.getName(...); 
        // NullPointerException when junit because "person" object is null
    }
 }

现在我正在使用 junit 来测试 MyClass 以满足代码覆盖率要求。出于某种原因,当 junit 调用 person.getName() 时,它总是给我 NullPointer 异常。

public class MyClassTest {

@MockBean
private SomeClass someClass;

@Autowired
private MyClass myClass;

@Test
public void test(){

Person<Student> studentPerson =
     (Person<Student>)Mockito.mock(Person.class);

Mockito.when(someClass.createPerson(ArgumentMatchers.any()))
       .thenReturn(studentPerson);

Mockito.when(studentPerson.getName(ArgumentMatchers.any()))
       .thenReturn("some data");

// call real method
myClass.myMethod(); // failed with NullPointerException

我不知道为什么 studentPerson 没有被正确地模拟导致 NullPointerException 因为它是 Null。有人可以帮忙吗?谢谢。

标签: junitmockito

解决方案


推荐阅读