java - MockMvc Sp​​ring 空指针

标签 java spring spring-mvc spring-test

您好,我是 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 Sp​​ring 空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36908564/

相关文章:

java - Spring security 3.1如何处理不同的认证异常?

java - clamav-rest Spring 3.2 RestTemplate 导致 400 错误请求

mysql - Spring Data 比较 2 个日期范围

java - 在 Spring Boot 中使用 JavaMailSender

java - Spring MVC Hibernate session 错误

java - java Spring Web 应用程序中是否有 JSP 的替代方案用于 open-id 身份验证?

java - 如何将日期差异作为具有毫秒精度的 float

java - 如何从 JSON 文本中获取 url

java - 当我在主类中使用抽象或接口(interface)时,在运行时将类添加到类路径时出现 NoClassDefFoundError

java - 如何使用 Spring 手动 Autowiring bean?