繁体   English   中英

使用Mockito模拟HttpSession

[英]Mocking HttpSession using Mockito

我需要测试以下控制器方法:

@RequestMapping(value="/addLocation")
public String addLocation(HttpServletRequest request, HttpSession session) {

    String location = (String) request.getParameter("plz_ort");
    String radius = (String) request.getParameter("umkreis");

    ((ArrayList<String>) session.getAttribute("queryTopics")).clone();        

    ...
}

因此,我使用Mockito和JUnit编写了此测试类

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.ArrayList;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

public class MyControllerTest {


    @InjectMocks
    private MyController myController;

    private MockMvc mockMvc;

    @InjectMocks
    MockHttpSession session;

    @Before
    public void setup() {

        // Process mock annotations
        MockitoAnnotations.initMocks(this);

        // Setup Spring test in standalone mode
        this.mockMvc = MockMvcBuilders.standaloneSetup(MyController)
                .build();

    }

    @Test
    public void addLocation_StatusOK() throws Exception {
        session.setAttribute("queryTopics", new ArrayList<String>(0));

        this.mockMvc.perform(
                post("/addLocation")
                        .param("plz_ort", "PLZ ORT")
                        .param("umkreis", "5"))
                .andExpect(
                        status().isOk());

    }

}

如您所见,运行此测试时,我需要模拟会话。 当我调试代码并停止在session.setAttribute("queryTopics", new ArrayList<String>(0)); 会话对象是org.springframework.mock.web.MockHttpSession@5583d693 (包含属性哈希图{queryTopics=[]} ),所以我认为很好。 但是我的下一个断点的会话对象在((ArrayList<String>) session.getAttribute("queryTopics")).clone(); org.springframework.mock.web.MockHttpSession@7545a27f

至少它是正确的类型( MockHttpSession ),但是它具有不同的ID,因此它实际上是一个全新的对象,因此不包含测试中的会话属性。

您能帮我解决这个问题吗?

模拟MVC将创建一个Spring模拟请求和一个Spring模拟会话,然后调用您的控制器方法。 为了在调用controller方法之前在会话中设置某些状态,您需要使用构建器来配置模拟请求

public class MyControllerTest {

    @InjectMocks
    private MyController myController;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        // Process mock annotations
        MockitoAnnotations.initMocks(this);

        // Setup Spring test in standalone mode
        this.mockMvc = MockMvcBuilders.standaloneSetup(MyController)
                .build();

    }

    @Test
    public void addLocation_StatusOK() throws Exception {
        this.mockMvc.perform(
                post("/addLocation")
                        .param("plz_ort", "PLZ ORT")
                        .param("umkreis", "5")
                        .sessionAttr("queryTopics", new ArrayList<String>(0))
                .andExpect(
                        status().isOk());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM