【问题标题】:Mockito when() method not working and getting null pointer exceptionMockito when() 方法不起作用并获取空指针异常
【发布时间】:2020-08-26 05:52:12
【问题描述】:

我正在使用 Mockito 和 JUnit 编写单元测试用例。但是在运行测试时得到NullPointerException。在调试时,我知道 Mockito on method: when().thenReturn() 没有返回依赖方法的值,而调用程序正在调用这些方法来获取结果。

下面是我用来了解代码结构的虚拟代码:

class B {
  public C getValue() {
    return C;
  }
}

class A {
  public D getAns(String q1, String q2) {
    return B.getValue().map(mapper::toD); //null pointer exception start here 
  } 
}

@RunWith(MockitoJunitrunner.test)
class TestA {
  
  @InjectMock
  A a;

  @Mock
  B b;
  C c;

  init() {
    when(b.getValue()).thenReturn(c);
  }

  @Test
  public void getA() {
    D ans=A.getAns(q1,q2);  //getting null pointer exception here 
    AssertNotNull(ans);
  }
}

【问题讨论】:

  • 使用@Mock 到C c
  • 没有任何东西可以注入 A 并且看起来 getValue() 是一个静态方法。如果不是这种情况,请添加代表您的情况的代码。
  • getValue() 不是静态的。我的代码和上面的代码一模一样

标签: java spring junit mockito springmockito


【解决方案1】:

你有类调用彼此的方法,所以最好使用Mockito.RETURNS_DEEP_STUBS

在你的情况下:

A 正在调用 BB 正在调用 C

只需替换:

 @InjectMock
  A a;

  @Mock
  B b;
  C c;

与:

A a = Mockito.mock(A.class, Mockito.RETURNS_DEEP_STUBS);
B b = Mockito.mock(B.class, Mockito.RETURNS_DEEP_STUBS);
C c = Mockito.mock(C.class, Mockito.RETURNS_DEEP_STUBS);

【讨论】:

  • A 呼叫 B,B 呼叫 C
  • @SakshiMishra 然后使用A a = Mockito.mock(A.class, Mockito.RETURNS_DEEP_STUBS); B b = Mockito.mock(B.class, Mockito.RETURNS_DEEP_STUBS); 而不是简单的模拟。试试看,如果你仍然得到 NPE,请告诉我??
【解决方案2】:

when(...).thenReturn(...) 未被调用的原因可能有多种:

  1. 构造不完全匹配时使用的数据类型,例如,如果你有一个字符串并且你传递null,它的方法调用不一样
  2. 确保使用相同的方法初始化对象。 spring 注入的资源与使用 new 运算符创建的资源不同

【讨论】:

  • 这帮助我找到了我的问题——结合不匹配的参数和 RETURNS_DEEP_STUBS,mockito 正在返回模拟存根而不是我想要的。谢谢!
猜你喜欢
  • 2022-11-20
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多