Jony Mittal
Jony Mittal

Reputation: 151

Junit mockito unit test case gives null pointer exception

Hello i am new in Junit mockito
i am trying to write a unit test case but when i am run the test case i am getting null pointer exception.

Code Snip:

package com.dataguise.webservices;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;


import static org.mockito.Mockito.*;

import com.dataguise.cache.CacheManager;
import com.dataguise.controller.CentralController;

import com.dataguise.webservices.beans.DgUserAuthorities;

class RestAPIsTest {


    @InjectMocks
    private CentralController controller;

    @Mock
    DgUserAuthorities dgUserAuthorities;

    @Mock
    private CacheManager cacheManager;


    @BeforeEach
    public void setup() {
        when(this.cacheManager.getCache(anyString())).thenReturn(true);
        MockitoAnnotations.initMocks(this);

    }

    @Test
    void testSession() {
        try {

            dgUserAuthorities = controller.login("d", "d", "", false);
            when(controller.login("d", "d", "", false)).thenReturn(dgUserAuthorities);
            assertEquals(dgUserAuthorities, dgUserAuthorities);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

While the same method call in the rest api gives the appropriate result.

Upvotes: 0

Views: 3031

Answers (1)

Lesiak
Lesiak

Reputation: 26084

There are 2 errors in your test

Error 1: Mixing JUnit4 and JUnit5 annotations

  • org.junit.jupiter.api.Test is from JUnit 5
  • org.junit.Before is from JUnit 4

Thus, your @Before method is never executed. Use org.junit.jupiter.api.BeforeEach instead

Error 2: Using Spring annotations without Spring Extension

@Autowired comes from Spring's DI framework. It will be injected only if you use Spring Injection/ runner

If you want MockitoAnnotations.initMocks(this); to build object under test and inject all mocks, use @InjectMocks

Error 3: confusing way of initializing mocks

There are 2 ways to initialize your mocks:

Manually:

this.dgUserAuthorities = mock(DgUserAuthorities.class);
this.controller = new CentralController(this.dgUserAuthorities);

Using annotations

@InjectMocks
private CentralController controller;

@Mock
DgUserAuthorities dgUserAuthorities;

Annotations require a call to MockitoAnnotations.initMocks(this) or using a Mockito Extension: @ExtendWith(MockitoExtension.class)

I strongly discourage you to mix the 2 approaches. Also, if you use annotations, do not initialize the fields yourself.

Upvotes: 3

Related Questions