Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mockito when() method not working and getting null pointer exception

I am writing unit test cases using Mockito and JUnit . But getting NullPointerException when running a test. On debugging I get to know that Mockito on method: when().thenReturn() is not returning a value for dependent methods and the calling program is calling those methods to get result.

Below is my dummy code to get idea of structure of code:

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);
  }
}
like image 794
Sam Avatar asked Dec 15 '25 04:12

Sam


2 Answers

You have classes calling each others methods so it is better to use Mockito.RETURNS_DEEP_STUBS

In your Case:

A is calling B and B is calling C

Just replace:

 @InjectMock
  A a;

  @Mock
  B b;
  C c;

With :

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);
like image 169
Vishwa Ratna Avatar answered Dec 16 '25 20:12

Vishwa Ratna


There may be multiple reason to why when(...).thenReturn(...) is not called :

  1. The data type which is used in when construct is not matching exact, for example, if you have a string and you pass null, its not same method call
  2. Ensure that the objects are getting initialized using the same approach. A spring injected resource is not same as the one created using new operator
like image 38
Soni Avatar answered Dec 16 '25 21:12

Soni



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!