'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);
}
}
Solution 1:[1]
You have classes calling each others methods so it is better to use Mockito.RETURNS_DEEP_STUBS
In your Case:
A
is callingB
andB
is callingC
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);
Solution 2:[2]
There may be multiple reason to why when(...).thenReturn(...)
is not called :
- 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
- 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
Solution 3:[3]
use @InjectMock and @Mock to solve this issue
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Soni |
Solution 3 | Sam |