0

Getting a null pointer exception on Mockito.when for the below code line.

when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");

Trying to mock entity manager which is declared as

@Mock
private EntityManager entityManager;

Any help to resolve this?

Complete test class

@RunWith(MockitoJUnitRunner.class)
public class ASDAOImplTest {

    @InjectMocks
    ASDAOImpl asdaoImpl=new ASDAOImpl();
    @Mock
    private EntityManager entityManager;

    @Before
    public void setUp()
    {
        ReflectionTestUtils.setField(asdaoImpl,"capLimit", 1);
    }

    @Test
    @Ignore
    public void validateCappingTest()
    {
        when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");
        asdaoImpl.validateCapping("2");
    }
}
Paolo Forgia
  • 6,572
  • 8
  • 46
  • 58
Jill
  • 163
  • 1
  • 5
  • 20

1 Answers1

7

Edit: Ah, spoke to soon. The error is here...

when(entityManager.createQuery(any(String.class)).setParameter(...)

entityManager is a mock. Per default, a mock will return null. So, entityManager.createQuery(...) will return null. Calling setParameter on null is a NPE.

What you need to insert is a query mock...

@Mock
private Query query;

...

// when createQuery is called, return the mocked query object (instead of null)
when(entityManager.createQuery(any(String.class)).thenReturn(query);

// make sure that setParameter returns this query object back (would otherwise also be NPE)
when(query.setParameter(any(String.class), any(String.class)).thenReturn(query);

// And return the desired result from getSingleResult
when(query.getSingleResult()).thenReturn("2");

Old answer:

Hard to say without the complete code, but a guess would be that you are misssing the Mockito initialization (the part that actually creates object for the variables annotated with @Mock). This can be done in at least two ways:

// Run the whole test with the Mockito runner...
@RunWith(MockitoJUnitRunner.class) 
public class MyTestClass { ...

or...

// Do the Mockito initialization "manually"
@Before
public void init() {
    MockitoAnnotations.initMocks(this);
}

Both ways will lead to Mockito creating all the objects where the variables are annotated with @Mock (it also handles @InjectMocks, etc.).

If this doesn't help, you will have to post more of your test class, otherwise probably noone can help.

Florian Schaetz
  • 10,454
  • 5
  • 32
  • 58