测试代码:package com.teachers.test;import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import com.github.pagehelper.PageInfo;//使用spring测试模块进行测试@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations= {"classpath:*/applicationContext.xml","classpath:*/dispatcherServlet-servlet.xml"})
public class FindAllVideoControllerTest {
MockMvc mockMvc;

@Autowired
WebApplicationContext context;


@Before
public void init() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}

@Test
public void testController() throws Exception {
MockHttpServletRequestBuilder req = MockMvcRequestBuilders.get("classpath:findAllVideos").param("pageNum", "1");
MvcResult ret = mockMvc.perform(req).andReturn();
   MockHttpServletRequest request = ret.getRequest();
PageInfo<?> pageInfo = (PageInfo<?>) request.getAttribute("pageInfo");
System.out.println(pageInfo);

}

}
package com.teachers.test;import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import com.github.pagehelper.PageInfo;//使用spring测试模块进行测试@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations= {"classpath:*/applicationContext.xml","classpath:*/dispatcherServlet-servlet.xml"})
public class FindAllVideoControllerTest {
MockMvc mockMvc;

@Autowired
WebApplicationContext context;


@Before
public void init() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}

@Test
public void testController() throws Exception {
MockHttpServletRequestBuilder req = MockMvcRequestBuilders.get("classpath:findAllVideos").param("pageNum", "1");
MvcResult ret = mockMvc.perform(req).andReturn();
   MockHttpServletRequest request = ret.getRequest();
PageInfo<?> pageInfo = (PageInfo<?>) request.getAttribute("pageInfo");
System.out.println(pageInfo);

}

}Controller代码:package com.teachers.controller;import java.util.List;import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.teachers.beans.VideoWithBLOBs;
import com.teachers.service.VideoService;@Controller
public class VideosController {

@Autowired
VideoService videoService;
//默认分页查询
@RequestMapping("/findAllVideos")
public String getVideos(@RequestParam(value="pageNum",defaultValue = "1")Integer pageNum,
Model model) {
System.out.println("controller");
//利用pageHelper创建分页
PageHelper.startPage(pageNum, 5);
List<VideoWithBLOBs> list = videoService.getAll();
System.out.println("running");
//这个PageInfo的构造器表示,显示连续五个页面的按钮
PageInfo<VideoWithBLOBs> pageInfo = new PageInfo<VideoWithBLOBs>(list,5);
model.addAttribute("pageInfo", pageInfo);
System.out.println(model);
return "list";
}
}文件组织结构:当我在测试代码里面随便写一个URI的时候输出一个null,写成上面的地址的时候报空指针异常,两个写法Controller中的代码都没有被执行,请问是什么问题,我传入的对象都是自动装配成功了的。

解决方案 »

  1.   

    错误信息:java.lang.NullPointerException
    at org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.updatePathRequestProperties(MockHttpServletRequestBuilder.java:682)
    at org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.buildRequest(MockHttpServletRequestBuilder.java:604)
    at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:141)
    at com.teachers.test.FindAllVideoControllerTest.testController(FindAllVideoControllerTest.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:42)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.Iterator.forEachRemaining(Unknown Source)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.forEach(Unknown Source)
    at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:83)
    at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:74)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
      

  2.   

    看源代码貌似是requestUri为空,
    private void updatePathRequestProperties(MockHttpServletRequest request, String requestUri) {
    if (!requestUri.startsWith(this.contextPath)) {参考下面的方法传入mockMvc.perform的参数试试
    https://stackoverflow.com/questions/32245785/how-do-i-give-request-parameters-for-a-post-using-mockmvc
      

  3.   

    您好,换成示例中的提交方法之后
    package com.teachers.test;import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mock.web.MockHttpServletRequest;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.web.WebAppConfiguration;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;import com.github.pagehelper.PageInfo;//使用spring测试模块进行测试@RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(locations= {"classpath:*/applicationContext.xml","classpath:*/dispatcherServlet-servlet.xml"})
    public class FindAllVideoControllerTest {
    MockMvc mockMvc;

    @Autowired
    WebApplicationContext context;


    @Before
    public void init() {
    mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    public void testController() throws Exception {
    MockHttpServletRequestBuilder req = MockMvcRequestBuilders.post("/findAllVideos","reqType=delete").param("pageNum", "1");
    MvcResult ret = mockMvc.perform(req).andReturn();
       MockHttpServletRequest request = ret.getRequest();
    PageInfo<?> pageInfo = (PageInfo<?>) request.getAttribute("pageInfo");
    System.out.println(pageInfo);
    }

    }只输出了一个null,Controller依然没有执行。
      

  4.   

    试了试获取Status,发现如果路径写错了之后会输出null,如果路径对了就会nullException代码:package com.teachers.test;import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mock.web.MockHttpServletRequest;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.web.WebAppConfiguration;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.MvcResult;
    import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;import com.github.pagehelper.PageInfo;//使用spring测试模块进行测试@RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration(locations= {"classpath:*/applicationContext.xml","classpath:*/dispatcherServlet-servlet.xml"})
    public class FindAllVideoControllerTest {
    MockMvc mockMvc;

    @Autowired
    WebApplicationContext context;


    @Before
    public void init() {
    mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    public void testController() throws Exception {
    MockHttpServletRequestBuilder req = MockMvcRequestBuilders.post("/findAllVideos").param("pageNum", "1");
    int ret = mockMvc.perform(req).andReturn().getResponse().getStatus();
    //   MockHttpServletRequest request = ret.getRequest();
    // PageInfo<?> pageInfo = (PageInfo<?>) request.getAttribute("pageInfo");
    System.out.println(ret);
    }

    }
      

  5.   

    web.xml 文件 :
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <!-- 配置spring配置文件的名称和位置 -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classPath:applicationContext.xml</param-value>
    </context-param> <!-- 启动IOC容器的ServletContextListener -->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> <!-- 配置springMVC 前端控制器 -->
    <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:dispatcherServlet-servlet.xml</param-value>
    </init-param>
    <!--用来标记是否在项目启动时就加在此Servlet,0或正数表示容器在应用启动时就加载这个Servlet, 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载.正数值越小启动优先值越高 -->
    <load-on-startup>1</load-on-startup>
    </servlet> <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping> <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
    <param-name>forceRequestEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    <init-param>
    <param-name>forceResponseEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter> <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>


    <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    </web-app>