我正在尝试将Cucumber添加到已经使用spring-test和JUnit的Spring Web MVC项目中。我已编写的非Cucumber集成测试已自动装入WebApplicationContext,然后为每个测试创建MockMvc
。我试图工作的Cucumber example在步骤定义类的生命周期内注入一次MockMvc
。
API docs for MockMVC没有就如何调用perform
修改MockMvc
实例以及是否可以重复使用MockMvc
实例进行多次测试提供任何指导。我也无法在reference docs中找到明确的答案。
MockMvc
的合同是什么?我应该为每个测试创建一个新的吗?
答案 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_ATTRIBUTE
和TestDispatcherServlet
是线程安全的,filters
和servletContext
仅在初始化期间设置。
filters
和servletContext
也应该是线程安全且无状态的。 defaultRequestBuilder
,defaultResultMatchers
和defaultResultHandlers
有一个setter方法。从技术角度来看,MockMvc
不是线程安全的,不应该重用。这些setter是包私有的,MockMvc
实例只能通过MockMvcBuilders
获取。因此,您之后无法操纵MockMvc
实例,以便它可以在多个测试中实际恢复。
答案 1 :(得分:2)
MockMvc可以创建一次并用于任意数量的请求。