我是否需要为每个测试创建一个新的 MockMvc?
Do I need to create a new MockMvc for each test?
我正在尝试添加 Cucumber to my Spring Web MVC project which is already using spring-test and JUnit. The non-Cucumber integration tests I’ve already written have the WebApplicationContext autowired in, then created a MockMvc
for each test. The Cucumber example 我正在尝试在步骤定义 class 的生命周期内注入 MockMvc
一次。
API docs for MockMVC don’t give any guidance on how calling perform
modifies a MockMvc
instance, and whether it’s acceptable to reuse a MockMvc
instance for multiple tests. I also wasn’t able to find a definite answer in the reference docs。
与 MockMvc
的合同是什么?我应该为每个测试创建一个新的吗?
看看MockMvc
的实例变量,你或许就能推导出答案。
static String MVC_RESULT_ATTRIBUTE = MockMvc.class.getName().concat(".MVC_RESULT_ATTRIBUTE");
private final TestDispatcherServlet servlet;
private final Filter[] filters;
private final ServletContext servletContext;
private RequestBuilder defaultRequestBuilder;
private List<ResultMatcher> defaultResultMatchers = new ArrayList<ResultMatcher>();
private List<ResultHandler> defaultResultHandlers = new ArrayList<ResultHandler>();
Instance/class 变量 MVC_RESULT_ATTRIBUTE
和 TestDispatcherServlet
是线程安全的,而 filters
和 servletContext
仅在初始化期间设置。
filters
和 servletContext
也应该是线程安全和无状态的。 defaultRequestBuilder
、defaultResultMatchers
和 defaultResultHandlers
有一个 setter 方法。从技术角度来看 MockMvc
不是线程安全的,不应重复使用。这些 setter 是包私有的,MockMvc
实例只能通过 MockMvcBuilders
获取。因此你不能在之后操纵一个 MockMvc
实例,这样它实际上可以在多个测试中重新使用。
MockMvc 可以创建一次并用于任意数量的请求。
我正在尝试添加 Cucumber to my Spring Web MVC project which is already using spring-test and JUnit. The non-Cucumber integration tests I’ve already written have the WebApplicationContext autowired in, then created a MockMvc
for each test. The Cucumber example 我正在尝试在步骤定义 class 的生命周期内注入 MockMvc
一次。
API docs for MockMVC don’t give any guidance on how calling perform
modifies a MockMvc
instance, and whether it’s acceptable to reuse a MockMvc
instance for multiple tests. I also wasn’t able to find a definite answer in the reference docs。
与 MockMvc
的合同是什么?我应该为每个测试创建一个新的吗?
看看MockMvc
的实例变量,你或许就能推导出答案。
static String MVC_RESULT_ATTRIBUTE = MockMvc.class.getName().concat(".MVC_RESULT_ATTRIBUTE");
private final TestDispatcherServlet servlet;
private final Filter[] filters;
private final ServletContext servletContext;
private RequestBuilder defaultRequestBuilder;
private List<ResultMatcher> defaultResultMatchers = new ArrayList<ResultMatcher>();
private List<ResultHandler> defaultResultHandlers = new ArrayList<ResultHandler>();
Instance/class 变量 MVC_RESULT_ATTRIBUTE
和 TestDispatcherServlet
是线程安全的,而 filters
和 servletContext
仅在初始化期间设置。
filters
和 servletContext
也应该是线程安全和无状态的。 defaultRequestBuilder
、defaultResultMatchers
和 defaultResultHandlers
有一个 setter 方法。从技术角度来看 MockMvc
不是线程安全的,不应重复使用。这些 setter 是包私有的,MockMvc
实例只能通过 MockMvcBuilders
获取。因此你不能在之后操纵一个 MockMvc
实例,这样它实际上可以在多个测试中重新使用。
MockMvc 可以创建一次并用于任意数量的请求。