简体   繁体   中英

Getting NullPointerException while mocking in SpringBoot

Am trying to write a Junit Test case for one of the class. But getting error while trying to do it,

Test class looks like below -

public class IntegratorClassTest{
    @InjectMocks    
    IntegratorClass integratorClass;

    @Mock
    RequestClass requestClass;

    @Mock
    ContentList contentResponse;

    @Before
    public void setUp() throws Exception {

        MockitoAnnotations.initMocks(this);
    }


    @Test
    public void getCmsOffersTest()throws Exception{
        ContentService contentService = Mockito.mock(ContentService.class);
        RequestClass requestClass = Mockito.mock(RequestClass.class);
        ContentList contentResponse = getContentList();
        when(contentService.getContentCollection()).thenReturn(contentResponse);

        Validator validator = Mockito.mock(Validator.class);
        List<OfferDetails> offerList = new ArrayList<OfferDetails>();
        Mockito.doNothing().when(validator).validateData(offerList);

        List<OfferDetails> offerListResult = integratorClass.getCmsOffers(contentService, requestClass);
        assertTrue(offerListResult.size()>0);
    }
}

And the implementation class looks something like below -

public class IntegratorClass {
    private static final Logger LOGGER = LoggerFactory.getLogger(IntegratorClass.class);

    @Autowired
    Validator validator;

    public List<OfferDetails> getCmsOffers(ContentService contentService,RequestClass requestClass)throws Exception{
        LOGGER.info("Entered method getCmsOffers to get the list of offers from CMS");
        List<OfferDetails> offerList = new ArrayList<OfferDetails>();
        ContentList contentResponse = null;
        try 
        {
            contentResponse = contentService.getContentCollection();
            offerList = getOfferListFromCmsResponse(contentResponse, requestClass);

            LOGGER.info("Total number of active offers we got from CMS are -" + offerList.size());
        }catch (Exception e)
        {
            ErrorResponse errorResponse = PromotionalOffersUtilities.createErrorResponse("500", e.getMessage(),"Getting error while fetching content from CMS - getCmsOffers", ErrorResponse.Type.ERROR);
            LOGGER.error("Getting error while fetching content from CMS with Error Message: " + e.getMessage());
            throw new ServiceException(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
        }

        //failing here
        validator.validateData(offerList);
        LOGGER.info("Exiting method getCmsOffers");

        return offerList;
    }
}

When I ran it in debug mode am error for the line validator.validateData(offerList); .

It is returning " NullPointerException ".

You need to include the Validator when mocking dependencies so that it will be injected into the subject under test

@Mock
Validator validator;

Also when arranging the behavior of the validator use an argument matcher for the invoked member as the current setup wont match because they will be comparing different instances when exercising the test.

Mockito.doNothing().when(validator).validateData(any(List<OfferDetails>.class));

You are manually mocking the other dependencies within the test method so they are not needed out side of that

The test now becomes

public class IntegratorClassTest{
    @InjectMocks
    IntegratorClass integratorClass;

    @Mock
    Validator validator;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getCmsOffersTest()throws Exception{
        //Arrange
        ContentService contentService = Mockito.mock(ContentService.class);
        RequestClass requestClass = Mockito.mock(RequestClass.class);
        ContentList contentResponse = getContentList();
        Mockito.when(contentService.getContentCollection()).thenReturn(contentResponse);

        Mockito.doNothing().when(validator).validateData(any(List<OfferDetails>.class));

        //Act
        List<OfferDetails> offerListResult = integratorClass.getCmsOffers(contentService, requestClass);

        //Assert
        assertTrue(offerListResult.size() > 0);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM