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

Sou*_*abh 9 java junit mocking mockito mockmvc

我试图用TDD弄湿我的脚.我正在尝试使用Mockito与MockMvc和Junit一起为控制器编写单元测试用例.

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

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

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*der 9

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

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

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

-verbose:class
Run Code Online (Sandbox Code Playgroud)

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