首页 > 解决方案 > 在 Spring 中测试 RestController 时 HttpServletRequest 为空

问题描述

我正在开发一个 Spring Web 服务,我需要读取数据并将它们设置为拦截器中的 Session 属性。当我使用外部客户端测试端点时,一切正常。但是,NullPointerException当我尝试下面的代码时,我得到了一个:

@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;

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 会按预期工作,但是当我尝试在 AccountController 中访问它们时,会引发异常。我已经尝试过使用MockMvcRequestBuilders,但它也不起作用。

访问属性的代码:

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

提前致谢!

标签: javaspringtesting

解决方案


推荐阅读