您好,我是 Spring 测试框架的新手,我有以下代码要测试 Spring MVC Controller :
public ModelAndView viewChangePassword(ModelMap model, Principal principal, HttpServletRequest request) throws NSException, SQLException {
System.err.println("testing");
String name = principal.getName();
.....
}
请找到 Controller 中定义的以下字段和 initBinder 方法:
@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:
@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")
);
}
当我运行单元测试时,显示以下空指针异常:
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 行:
mockMvc.perform(
我不确定这里的 null 是什么,知道如何解决这个问题吗?
只是想指出,在同一个类中,此方法工作正常,没有问题:
@Test
public void defaultPageTestOK() throws Exception{
mockMvc.perform(get("/"))
.andExpect(redirectedUrl("/view"))
.andExpect(status().isFound()
);
}
预先感谢您的任何建议。
最佳答案
虽然最初的问题是在几年前报告的,但我遇到了同样的问题——mockMvc.perform() 上的 NullPointerException
经过大量调试后,我发现我编写的用于验证我的请求的自定义 JWT 过滤器内部存在空指针问题,该问题在 Perform() 方法本身上被报告为 NullPointerException。
一旦我修复了过滤器以避免空指针异常,一切就开始工作了。
关于java - MockMvc Spring 空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36908564/