java.lang.NoSuchMethodError:使用Mockito和Junit时的javax.servlet.http.HttpServletRequest.isAsyncStarted()

我试图用TDD弄湿我的脚。 我正在尝试使用Mockito与MockMvc和Junit一起为控制器编写unit testing用例。

但是我收到运行时错误,从而导致测试失败。 起初,由于找不到javax.servlet.SessionCookieConfig ,我在设置中初始化MockMvc实例时遇到了问题。

我通过下载javax.servlet api并将其配置到项目的构建路径来解决,但后来我面临着

 java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() 

在MockMvc实例上使用perform()

任何人都可以告诉我如何处理这种依赖,因为我认为它是由于不兼容的服务器servlet-api和javax.servlet api而发生的。

编辑:我发布我用于unit testing的代码,但我不认为这将是任何帮助,但以防万一:

 @RunWith(MockitoJUnitRunner.class) public class MyControllerTest { @InjectMocks private MyController myController = new MyController(); @Mock private MyService myService = new MyServiceImpl(); private MockMvc mockMvc; @Before public void setUp(){ this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build(); } @Test public void testList() throws Exception{ A a = new A(); a = createMockClassA(); Mockito.when(myService.getServiceForA(Mockito.anyMapOf(String.class, String.class))).thenReturn(a); MvcResult result = this.mockMvc.perform(get("/somePath/")).param("someExpectedParam","value").andReturn(); System.out.println(result.getResponse().getContentAsString()); } private static A createMockClassA(){ A a = new A(); a.setId(i); a.setTitle("mock-" + i); return a; } } 

这听起来很像你在类路径中有错误版本的servlet API。

检查何时将isAsyncStarted添加到API并确保您在类路径中引用的那个至少是该版本或更高版本。

为了找到“错误”类版本的来源,你可以使用

 -verbose:class 

java的参数。 它将列出所有加载的类,如果我没记错的话,它们会被加载。 有关详细信息,请参见http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html 。

当您的开发和生产环境使用不同的servlet API版本时,就会发生这种情况。

在使用tomcat7(例如)构建时,它支持servlet 3,因此您不会收到任何错误。

虽然在较低版本的tomcat上做同样的事情,但它会抛出错误。

方案

升级其中一个环境以支持servlet 3,或者只是降级代码以使用servlet 2.5

错误消息表明您的类路径中有错误的Servlet API版本。

如果您正在使用Gradle执行

 gradle dependencies 

分析依赖树并排除版本小于3.0的’servlet-api’依赖关系。 您可以执行以下操作以排除

 compile ('javax.servlet:jsp-api:2.0'){ exclude module : 'servlet-api' } 

可以存在多个依赖项,其进一步包括servlet-api-2.x。 排除所有这些

我找到了错误的解决方案。 提供的实际servlet api是gwt-servlet.jar,而gwt-servlet.jar中的servlet-api是旧版本。 因此,我配置了我的构建路径,使项目在构建时指向最新的servlet-api。

至于正确的答案,我认为我的投票给了Jens,因为他根据场景给出了最接近的解决方案。

感谢大家。 🙂

我通过将java构建路径tomcat添加为服务器运行时库来解决此问题

mockito javax.servlet.SessionCookieConfig问题

我有一个类似的问题,我的几个Junit测试没有工作(在intellij的想法),我也得到了java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest....用于那些unit testing。 当我尝试使用gradle从目录通过命令提示符通过使用命令gradle clean build编译完整项目时,代码正在成功编译。 虽然问题在于Intellij想法中的Junit测试,但他们显示出上述错误。 我只是将我的gradle版本从3.4.1更改为2.1.3。 我不知道为什么现在我的Junit测试正在编译,因为我的代码是通过intellij以及命令提示符编译的。 同样的问题发生在我的另一位同事身上,他也将gradle版本从4改为2的某个版本。问题得到了解决。