java.lang.NoSuchMethodError:javaxservlet.http.HttpServletRequest.isAsyncStarted()Z

java.lang.NoSuchMethodError:javaxservlet.http.HttpServletRequest.isAsyncStarted()Z,java,spring,junit,mockito,spring-test,Java,Spring,Junit,Mockito,Spring Test,我正在尝试使用JUnit和Mockito对我正在构建的SpringREST Web服务进行测试。我在尝试运行JUnit测试时遇到了一个bug,但找不到有关该问题的任何信息。stacktrace将错误行列为.andDo(print()),尽管我直接从spring.io教程中获得了这一行 测试类别代码: public class TestSuite { MockMvc mockMvc; @Mock RestController controller; @Before public voi

我正在尝试使用JUnit和Mockito对我正在构建的SpringREST Web服务进行测试。我在尝试运行JUnit测试时遇到了一个bug,但找不到有关该问题的任何信息。stacktrace将错误行列为
.andDo(print())
,尽管我直接从spring.io教程中获得了这一行

测试类别代码:

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)`

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

如参考手册章节所述

从Spring4.0开始,
org.springframework.mock.web
包中的mock集现在基于Servlet3.0API

因此,尽管SpringFramework4.0和4.1支持Servlet2.5进行部署,但是
SpringTest
模块中的ServletAPI模拟和SpringMVC测试框架需要Servlet3.0(特别是版本3.0.1或更高)

问候,


Sam(spring测试模块的负责人)

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

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

javax.servlet
javax.servlet-api
3.1.0
测试

可能我有一个应用程序面对相同的场景。我需要将应用部署到的容器仅支持Servlet2.5。是否有一种方法可以让spring测试至少在单元测试中与2.5一起工作?不,不可能在Servlet 2.5中使用
spring测试中的模拟Servlet API。但是,只要您不依赖生产代码(例如控制器)中的任何Servlet3.x特性,那么在部署Servlet2.5时针对Servlet3.x进行测试就没有问题。