-1

I'm developing a Spring boot web application. and I'm working on spring boot to test the rest api to get hospital list, but i'am getting the following exception every time

 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:66)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:166)
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:133)
    at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:166)
    at com.bezkoder.springjwt.Controller.HospitalControllerTest.testgetAllHospitals(HospitalControllerTest.java:134)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:78)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:84)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:161)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.NullPointerException
    at com.bezkoder.springjwt.controllers.HospitalController.getAllHospitals(HospitalController.java:64)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    ... 36 more

this is my test

package com.bezkoder.springjwt.Controller;

import com.bezkoder.springjwt.controllers.HospitalController;
import com.bezkoder.springjwt.models.Hospital;
import com.bezkoder.springjwt.repository.HospitalRepository;
import com.bezkoder.springjwt.services.HospitalService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import java.util.ArrayList;
import java.util.List;

import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

@RunWith(MockitoJUnitRunner.class)
public class HospitalControllerTest {


    @Mock
    private HospitalService hospitalService;

    @Mock
    private HospitalRepository hospitalRepository;

    @InjectMocks
    private HospitalController hospitalController;


    @Before
    public  void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(hospitalController).build();

    }


    private MockMvc mockMvc;

    private String mapToJson(Object object) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        return  objectMapper.writeValueAsString(object);
    }



    @Test
    public void  testcreateHospital() throws Exception {

        Hospital hospital = new Hospital();

        hospital.setId((long) 1);
        hospital.setName("appellib");
        hospital.setAdministrativeAddress("ad1234");
        hospital.setFinessNumber(123456);
        hospital.setSiretNumber(123456);
        String uri = "/api/auth/hospital/add";


       // String inputInJson = this.mapToJson(hospital);




        String inputInJson = this.mapToJson(hospital);
       // MvcResult result = mockMvc.perform(requestBuilder).andReturn();
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(uri)
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .content(inputInJson)).andReturn();

        int status = mvcResult.getResponse().getStatus();
        assertEquals(200, status);
        String content = mvcResult.getResponse().getContentAsString();
        assertEquals(content, "Hospital is created successfully");



    }


    @Test
    public void  testgetAllHospitals() throws Exception{

        String uri = "/api/auth/hospital/display";

        Hospital hospital = new Hospital();

        hospital.setId((long) 1);
        hospital.setName("appellib");
        hospital.setAdministrativeAddress("ad1234");
        hospital.setFinessNumber(123456);
        hospital.setSiretNumber(123456);



        Hospital hospital1 = new Hospital();

        hospital1.setId((long) 2);
        hospital1.setName("Aled");
        hospital1.setAdministrativeAddress("ad4567");
        hospital1.setFinessNumber(98765);
        hospital1.setSiretNumber(1256767);




        List<Hospital> hospitalsList = new ArrayList<>();
        hospitalsList.add(hospital);
        hospitalsList.add(hospital1);

        Mockito.when(hospitalService.findAll()).thenReturn(hospitalsList);



        RequestBuilder requestBuilder = MockMvcRequestBuilders.get(uri).accept(MediaType.APPLICATION_JSON);

        MvcResult result = mockMvc.perform(requestBuilder).andReturn();

        String expectedJson = this.mapToJson(hospitalsList);
        String outputInJson = result.getResponse().getContentAsString();
        MockHttpServletResponse response = result.getResponse();
        assertThat(outputInJson, is(equalTo(expectedJson)));
        assertEquals(HttpStatus.OK.value(), response.getStatus());



    }


}


and this is the function i'm testing

package com.bezkoder.springjwt.controllers;

import com.bezkoder.springjwt.models.Hospital;
import com.bezkoder.springjwt.payload.response.MessageResponse;
import com.bezkoder.springjwt.repository.HospitalRepository;
import com.bezkoder.springjwt.services.HospitalServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import java.util.logging.Logger;

@Controller
@RequestMapping("/api/auth/hospital")
public class HospitalController {

    Logger logger = Logger.getLogger("com.Appel.lib.Controller.HospitalController");

    @Autowired
    HospitalServiceImpl hospitalService;

    @Autowired
    HospitalRepository hospitalRepository;

    @PostMapping("/add")
    public ResponseEntity<?> createHospital(@RequestBody Hospital hospital){

        if (hospitalService.existsByName(hospital.getName())) {
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: name is already taken!"));
        }

        if (hospitalService.existsByAdministrativeAddress(hospital.getAdministrativeAddress())) {
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: administrative_address is already in use!"));
        }

        if (hospitalService.existsByFinessNumber(hospital.getFinessNumber())) {
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: finess_number is already taken!"));
        }

        if (hospitalService.existsBySiretNumber(hospital.getSiretNumber())) {
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: siret_number is already in use!"));
        }

        hospitalService.add(hospital);
        return ResponseEntity.ok(new MessageResponse("Hospital registered successfully!"));
    }

    @GetMapping("/display")
    public ResponseEntity<List<Hospital>>  getAllHospitals() {
        logger.info("Getting all Hospitals  from hospital table...Call getAllHospitals ");
        List<Hospital> hospitals = hospitalService.findAll();
        logger.info("Data extracted from hospital table...");
        return ResponseEntity.ok(hospitals) ;
    }

}

i searched stackoverflow for any solution to a similar error, but i didn't find any, any solution suggested to fix this ?

theproton
  • 11
  • 4
  • please, provide your test configuration – Felipe Bonfante May 21 '21 at 16:04
  • 1
    `at com.bezkoder.springjwt.controllers.HospitalController.getAllHospitals(HospitalController.java:64)`, hospitalService is probably null. – szatkus May 21 '21 at 16:04
  • As the exception says you've got a null at `HospitalController.java:64`. I'm not going to go counting lines, but you'll need to instantiate the object on line 64 before calling methods on it. – Roddy of the Frozen Peas May 21 '21 at 16:05
  • Does this answer your question? [What is a NullPointerException, and how do I fix it?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – blurfus May 21 '21 at 16:05
  • i already instantiate the object on line 64 ,i added the full class , please check it – theproton May 21 '21 at 16:13

2 Answers2

0

Instead of :

return ResponseEntity.ok(hospitals) ;

Try this :

return ResponseEntity<List<hospitals>>(hospitals);

Ishak
  • 51
  • 1
  • 6
0
at com.bezkoder.springjwt.controllers.HospitalController.getAllHospitals(HospitalController.java:64)

check the object at line 64 it return null

theproton
  • 11
  • 4