【问题标题】:java.lang.NoSuchMethodError: javaxservlet.http.HttpServletRequest.isAsyncStarted()Zjava.lang.NoSuchMethodError: javaxservlet.http.HttpServletRequest.isAsyncStarted()Z
【发布时间】:2014-11-14 10:35:20
【问题描述】:

我正在尝试使用 JUnit 和 Mockito 针对我正在构建的 Spring REST Web 服务运行测试。我在尝试运行 JUnit 测试时遇到了一个错误,但找不到有关该问题的任何信息。堆栈跟踪将错误行列为.andDo(print()),尽管我直接从spring.io 教程http://spring.io/guides/tutorials/rest/3/ 获得了该行@

测试类代码:

public class TestSuite {
    MockMvc mockMvc;

@Mock
RestController controller;

@Before
public void setup(){
    MockitoAnnotations.initMocks(this);
    this.mockMvc = standaloneSetup(controller)
        .setMessageConverters(new MappingJackson2HttpMessageConverter()).build();
}

@Test
public void testREST() throws Exception {
    when(controller.getThing(any(Integer.class))).thenReturn(TestFixture.getREST(1));
    this.mockMvc.perform(get("/{number}", String.valueOf(number))
    .accept(MediaType.APPLICATION_JSON))
    .andDo(print())
    .andExpect(status().isNotFound());
}}

堆栈跟踪:

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z
at org.springframework.test.web.servlet.result.PrintingResultHandler.printAsyncResult(PrintingResultHandler.java:131)
at org.springframework.test.web.servlet.result.PrintingResultHandler.handle(PrintingResultHandler.java:80)
at org.springframework.test.web.servlet.MockMvc$1.andDo(MockMvc.java:155)
at org.company.test.TestSuite.testREST(TestSuite.java:53)`

【问题讨论】:

标签: java spring junit mockito spring-test


【解决方案1】:

您使用的是旧版本的 Servlet 规范(例如 2.5);而您使用的spring-test 版本至少需要 Servlet 3.0。

如参考手册的Testing Improvements 部分所述,

从 Spring 4.0 开始,org.springframework.mock.web 包中的模拟集现在基于 Servlet 3.0 API。

因此,尽管 Spring Framework 4.0 和 4.1 支持 Servlet 2.5 进行部署,但 spring-test 模块中的 Servlet API 模拟和 Spring MVC 测试框架需要 Servlet 3.0 (特别是 3.0.1 或更高版本)。

问候,

Sam(spring-test 模块的负责人)

【讨论】:

  • 我有一个应用程序面临相同的情况。我需要将应用程序部署到的容器仅支持 Servlet 2.5。有没有办法让 spring-test 至少在单元测试中与 2.5 一起工作?
  • 不,不能在 Servlet 2.5 中使用 spring-test 中的 Mock Servlet API。但是,只要您不依赖生产代码中的任何 Servlet 3.x 功能(例如控制器),在针对 Servlet 2.5 进行部署时针对 Servlet 3.x 进行测试就没有问题。
【解决方案2】:

我收到这个错误是因为我的 pom.xml 中没有添加对 servlet 的依赖 添加接下来的几行解决了我的问题

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>test</scope>
</dependency>

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 2020-06-08
    • 2016-07-26
    • 2011-06-03
    • 2021-09-24
    • 2021-04-25
    • 2018-07-29
    • 2013-05-07
    相关资源
    最近更新 更多