java 使用 Mockito 模拟 HttpSession
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/30848865/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Mocking HttpSession using Mockito
提问by Erando
I need to test the following controller method:
我需要测试以下控制器方法:
@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();
...
}
Therefor I wrote this test class using Mockito and JUnit
因此我使用 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());
}
}
As you can see I need to mock the session when running this test.
When I debug through the code and stop at the line session.setAttribute("queryTopics", new ArrayList<String>(0));
the session object is org.springframework.mock.web.MockHttpSession@5583d693
(containing a attributes hash map {queryTopics=[]}
), so I think that's fine.
However the session object of my next breakpoint in line ((ArrayList<String>) session.getAttribute("queryTopics")).clone();
is org.springframework.mock.web.MockHttpSession@7545a27f
.
如您所见,我需要在运行此测试时模拟会话。当我调试代码并停在该行时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
.
At least it's the correct type (MockHttpSession
) but it's got a different ID so it's actually a whole new object and thus doesn't contain the session attributes from the test.
至少它是正确的类型 ( MockHttpSession
) 但它有一个不同的 ID 所以它实际上是一个全新的对象,因此不包含来自测试的会话属性。
Could you please help me out on this one?
你能帮我解决这个问题吗?
回答by JB Nizet
The mock MVC will create a spring mock request and a spring mock session and then invoke your controller method. In order to set some state in the session before the controller method is called, you need to configure the mock requestusing the builder:
模拟 MVC 将创建一个 spring 模拟请求和一个 spring 模拟会话,然后调用您的控制器方法。为了在调用控制器方法之前在会话中设置一些状态,您需要使用构建器配置模拟请求:
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());
}
}