MockMvc Spring null Pointer
嗨,我是Spring测试框架的新手,我有以下代码要测试Spring MVC Controller:
1 2 3 4 5 6 7 | public ModelAndView viewChangePassword(ModelMap model, Principal principal, HttpServletRequest request) throws NSException, SQLException { System.err.println("testing"); String name = principal.getName(); ..... } |
请在控制器中找到以下字段和initBinder方法定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | @Autowired private MessageSource msg; @Autowired private ApplicationMa applicationMa; @Autowired private SesVal sesVal; @Autowired private CommonManager commonManager; @Autowired private ApplicationListManager applicationListManager; @Autowired private QueryManager queryManager; @Autowired private Manager manager; @Autowired private FormBlankValidator formValidator; @Autowired private FormDataValidator dataValidator; @InitBinder protected void initBinder(HttpServletRequest request, WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat(Constants.DD_M_MYYYY); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } |
这是我的单元测试,我也在使用Mockito:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | @RunWith(MockitoJUnitRunner.class) public class ApplicationControllerTest { @InjectMocks private ApplicationController appController; @Mock Principal principal; @Mock private RequestAttributes requestAttributes; @Mock private SessionValidator sessionValidator; @Mock User user; private MockMvc mockMvc; @Before public void setup() { // Process mock annotations //MockitoAnnotations.initMocks(this); // Setup Spring test in standalone mode RequestContextHolder.setRequestAttributes(requestAttributes); this.mockMvc = MockMvcBuilders.standaloneSetup(appController).build(); } @Test public void viewChangePassword() throws Exception{ MockHttpServletRequest request = new MockHttpServletRequest(); when(principal.getName()).thenReturn("user1"); when(sessionValidator.isSessionValid(user)).thenReturn(true); mockMvc.perform( get("/viewChangePassword")) .andExpect(view().name("denied") ); } |
运行单元测试时,显示以下空指针异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Running com.controller.application.test.ApplicationControllerTest log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment). log4j:WARN Please initialize the log4j system properly. testing Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.063 sec <<< FAILURE! - in com.controller.application.test.ApplicationControllerTest viewChangePassword(com.controller.application.test.ApplicationControllerTest) Time elapsed: 0.688 sec <<< ERROR! org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException at com.controller.application.test.ApplicationControllerTest.viewChangePassword(ApplicationControllerTest.java:117) Caused by: java.lang.NullPointerException at com.controller.application.test.ApplicationControllerTest.viewChangePassword(ApplicationControllerTest.java:117) Results : Tests in error: ApplicationControllerTest.viewChangePassword:117 ?? NestedServlet Request proce... Tests run: 1, Failures: 0, Errors: 1, Skipped: 0 ------------------------------------------------------------------------ BUILD FAILURE ------------------------------------------------------------------------ Total time: 4.423 s |
这是第117行:
1 | mockMvc.perform( |
我不确定这里是否为null,请问如何解决此问题?
只需在同一类中指出此方法即可正常工作,没有任何问题:
1 2 3 4 5 6 7 8 9 | @Test public void defaultPageTestOK() throws Exception{ mockMvc.perform(get("/")) .andExpect(redirectedUrl("/view")) .andExpect(status().isFound() ); } |
谢谢您的任何建议。
尽管最初的问题是在几年前报告的,但我遇到了同样的问题-在MockMvc.perform()上出现了NullPointerException
经过大量调试后,我发现为验证请求而编写的自定义JWT筛选器中存在Null Pointer问题,该问题在perform()方法本身上被报告为NullPointerException。
一旦修复了过滤器以避免出现空指针异常,一切就开始起作用。