我是否需要为每个测试创建一个新的 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_ATTRIBUTETestDispatcherServlet 是线程安全的,而 filtersservletContext 仅在初始化期间设置。 filtersservletContext 也应该是线程安全和无状态的。 defaultRequestBuilderdefaultResultMatchersdefaultResultHandlers 有一个 setter 方法。从技术角度来看 MockMvc 不是线程安全的,不应重复使用。这些 setter 是包私有的,MockMvc 实例只能通过 MockMvcBuilders 获取。因此你不能在之后操纵一个 MockMvc 实例,这样它实际上可以在多个测试中重新使用。

MockMvc 可以创建一次并用于任意数量的请求。