vendredi 31 mai 2019

HttpServletRequest is null when testing RestController in Spring

I am developing a Spring webservice and I need to read data & set them as a Session attribute in an interceptor. Everything works fine when I test the endpoints using an external client. However, I get a NullPointerException when I try the code below:

@RunWith(SpringRunner.class)
@WebMvcTest(AccountController.class)
public class AccountControllerTest {

private MockMvc mockMvc;

@InjectMocks
private AccountController accountController;

@MockBean
private IncomingInterceptor incomingInterceptor;

@MockBean
private AccountService accountService;

@MockBean
private FileStoreService fileStoreService;

@MockBean
private HttpServletRequest request;

private Gson gson;

@Before
public void setup() {
    gson = new Gson();
    mockMvc = MockMvcBuilders.standaloneSetup(accountController).addInterceptors(incomingInterceptor).build();
}

@Test
public void testAddAccount() throws Exception {
    JsonObject root = new JsonObject();
    root.add("body", gson.toJsonTree(account));

    Mockito.when(accountController.addAccount()).thenReturn(new ResponseEntity<>(1L, HttpStatus.OK));

    MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/account/register")
            .content(root.toString())
            .characterEncoding("utf-8")
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();

    String contentAsString = mvcResult.getResponse().getContentAsString();
    System.out.println("contentAsString = " + contentAsString);
}
}

Everyting works as expected when the attributes are set in the interceptor but when I try to access them in AccountController an exception is thrown. I have already tried to use MockMvcRequestBuilders but it wasn't working either.

The code to access attributes:

 JsonObject body = (JsonObject) request.getSession().getAttribute("body");           

Thanks in advance!

Aucun commentaire:

Enregistrer un commentaire