我是否需要为每个测试创建一个新的MockMvc?

时间:2015-12-18 20:47:58

标签: java spring spring-mvc spring-test mockmvc

我正在尝试将Cucumber添加到已经使用spring-test和JUnit的Spring Web MVC项目中。我已编写的非Cucumber集成测试已自动装入WebApplicationContext,然后为每个测试创建MockMvc。我试图工作的Cucumber example在步骤定义类的生命周期内注入一次MockMvc

API docs for MockMVC没有就如何调用perform修改MockMvc实例以及是否可以重复使用MockMvc实例进行多次测试提供任何指导。我也无法在reference docs中找到明确的答案。

MockMvc的合同是什么?我应该为每个测试创建一个新的吗?

2 个答案:

答案 0 :(得分:2)

查看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>();

实例/类变量MVC_RESULT_ATTRIBUTETestDispatcherServlet是线程安全的,filtersservletContext仅在初始化期间设置。 filtersservletContext也应该是线程安全且无状态的。 defaultRequestBuilderdefaultResultMatchersdefaultResultHandlers有一个setter方法。从技术角度来看,MockMvc不是线程安全的,不应该重用。这些setter是包私有的,MockMvc实例只能通过MockMvcBuilders获取。因此,您之后无法操纵MockMvc实例,以便它可以在多个测试中实际恢复。

答案 1 :(得分:2)

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