11

我正试图用 TDD 弄湿我的脚。我正在尝试为使用 Mockito 以及 MockMvc 和 Junit 的控制器编写单元测试用例。

但是我遇到了运行时错误,因此我的测试失败了。起初,由于找不到javax.servlet.SessionCookieConfig.

我通过下载javax.servletapi 并将其配置到项目的构建路径中解决了这个问题,但后来我面临

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

perform()在 MockMvc 实例上使用时。

谁能告诉我如何处理这种依赖关系,因为我认为这是由于服务器 servlet-api 和 javax.servlet api 不兼容而发生的。

编辑:我正在发布我用于单元测试的代码,但我认为这不会有任何帮助,但以防万一:

@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;
    }
}
4

6 回答 6

11

这听起来很像您在类路径中使用了错误版本的 servlet API。

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

为了找到“错误”类版本来自的位置,您可以使用

-verbose:class

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

于 2014-05-20T12:32:26.080 回答
2

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

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

在较低版本的 tomcat 上执行相同操作时,会抛出错误。

解决方案

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

于 2014-05-20T12:40:47.260 回答
1

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

如果你使用 Gradle 执行

gradle dependencies

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

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

可以有多个依赖项,其中还包括 servlet-api-2.x。排除所有这些

于 2016-02-16T21:25:34.690 回答
0

I found the solution for my error. The actual servlet api that was getting provided was of gwt-servlet.jar and the servlet-api in the gwt-servlet.jar was of the older version. Thus I had configure my build path to make the project point to the latest servlet-api while building.

As for the correct answer, I think my vote goes to Jens since he did gave the solution closest as per the scenario.

Thanks everyone. :)

于 2014-05-23T06:39:06.960 回答
0

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

mockito javax.servlet.SessionCookieConfig 问题

于 2017-01-22T21:40:59.983 回答
0

我有一个类似的问题,我的 Junit 测试中很少有没有工作(在 intellij 的想法中),而且我也正在java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest....为这些单元测试做准备。当我尝试使用命令通过命令提示符从目录中使用 gradle 编译完整项目时gradle clean build,代码已成功编译。而问题在于 Intellij 想法中的 Junit 测试,他们显示了上述错误。我只是将我的 gradle 版本从 3.4.1 更改为 2.1.3。我不知道为什么现在我的 Junit 测试正在编译,并且我的代码正在通过 intellij 和命令提示符编译。我的另一位同事也出现了同样的问题,他也将 gradle 版本从 4 更改为 2 的某个版本。问题得到了解决。

于 2017-09-27T11:54:35.440 回答