【问题标题】:Do I need to create a new MockMvc for each test?我需要为每个测试创建一个新的 MockMvc 吗?
【发布时间】:2016-03-25 15:23:51
【问题描述】:

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

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

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

【问题讨论】:

  • 在您的测试中,创建@Before 并初始化mockmvc。看这里:http://stackoverflow.com/a/14566090/3710490
  • 谢谢你,@Valijon;这正是我在现有 JUnit 测试中的做法。但是,我引用的示例以不同的方式进行,我想知道MockMvc 的合同是否支持其他方式。

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


【解决方案1】:

看看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 不是线程安全的,不应该被重用。这些设置器是包私有的,MockMvc 实例只能通过MockMvcBuilders 获取。因此,您不能在之后操作 MockMvc 实例,以便它实际上可以在多个测试中重新使用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-29
      • 1970-01-01
      • 2013-07-01
      • 2021-12-08
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多