java - 在 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");
提前致谢!
解决方案
推荐阅读
- php - 将多个提交按钮重定向到不同的页面
- java - 在java中调用类的get方法
- sql-server - 为 TOP 或 FETCH 子句行计数参数提供的行数必须是整数
- ios - 如何在Objective-C中像Twitter一样显示预览
- php - 您的系统中缺少请求的 PHP 扩展 ext-iconv *。安装或启用 PHP 的 iconv 扩展
- java - 错误:在 Eclipse 和命令提示符下编译时无法找到或加载主类错误但在 intelliJIDEA 中有效
- spring-boot - 在配置中定义servlet路径时如何在spring boot中提供静态内容
- django - Django - 如何在基于函数的视图中使用模型方法
- python - Python - 如果在线程中获取锁,该线程中的所有变量是否都被锁定?
- html - 防止 riotjs/typescript 中的 html 注释被转译