【问题标题】:How to test a spring mvc controller如何测试一个spring mvc控制器
【发布时间】:2016-07-16 08:28:22
【问题描述】:

我有以下控制器:

@Controller
public class HomeController {
    @Resource(name="returnGraph")
    Graph returnGraph;

    @RequestMapping("/")
    public String goToHomePage(HttpSession session){
        session.setAttribute("sm", returnGraph.getVertexes());
        return "home";
    }
}

我尝试了以下 j 单元测试,但没有成功:

public class HomeControllerTest {

    @Mock
    Graph returnGraph;
    @Mock
    Map<String,Vertex> vertexes;
    @Mock
    HttpSession session;

    HomeController homeController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        homeController = new HomeController();
    }

    @Test
    public void testgoToHomePage(){
        when(returnGraph.getVertexes()).thenReturn(vertexes);
        assertEquals("home", homeController.goToHomePage(session));
    }
}

它说我有空指针异常。

session.setAttribute("sm", returnGraph.getVertexes());

但是我不知道为什么?我不确定我还能做些什么,我该如何处理 session.setAttribute。

【问题讨论】:

  • 两个快速点。如果HomeController 是您尝试注入模拟的点,则应使用@InjectMocks 进行注释。其次,尝试使用doReturn(vertexes).when(returnGraph).getVertexes();,而不是您使用的类似电话。
  • 它说:方法 doReturn(Map) 未定义 HomeControllerTest 类型
  • static import 的方法(就像你有 when 一样)。 import static org.mockito.Mockito.doReturn;
  • 而您几乎肯定想将该对象添加到模型中,而不是会话中。

标签: java spring junit mockito


【解决方案1】:

你可以试试 Spring MVC 测试框架,这里是 current documentationarchive documentation

你可以像这样测试你的控制器:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public abstract class HomeControllerTest {

    @Autowired
    protected WebApplicationContext context;

    @Resource(name="returnGraph")
    Graph returnGraph;

    protected MockMvc mockMvc;

    @Test
    public void testgoToHomePage(){
        this.mockMvc.perform(get("/")
           .andExpect(status().isOk())
           .andExpect(content().string("home"));
    }

}

【讨论】:

    【解决方案2】:
    @RunWith(SpringJUnit4ClassRunner.class)
    public class HomeControllerTest {
    
    @Mock
    Graph returnGraph;
    
    @Mock
    Map<String,Vertex> vertexes;
    
    @Mock
    HttpSession session;
    
    @InjectMocks
    HomeController homeController;
    
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    
    
    }
    
    @Test
    public void testgoToHomePage(){
        when(returnGraph.getVertexes()).thenReturn(vertexes);
        assertEquals("home", homeController.goToHomePage(session));
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      你必须使用这些注解:@RunWith(SpringJUnit4ClassRunner.class), @WebAppConfiguration

      如果使用 JavaConfig:@ContextConfiguration(classes = MyWebConfig.class)

      一个完整的工作示例:http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-mvc-unit-testing/

      【讨论】:

        猜你喜欢
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 2016-05-28
        • 2013-08-11
        • 2021-04-01
        • 1970-01-01
        相关资源
        最近更新 更多