当前位置: 首页 > 面试题库 >

java.lang.NoSuchMethodError:javax.servlet.http.HttpServletRequest.isAsyncStarted()同时将Mockito与Junit一起使用

柏正平
2023-03-14
问题内容

我正在尝试让TDD湿透。我正在尝试使用Mockito结合MockMvc和Junit编写控制器的单元测试用例。

但是我遇到了运行时错误,因此无法通过测试。起初我由于无法找到MockMvc实例而在安装中初始化MockMvc实例时遇到问题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;
    }
}

问题答案:

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

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

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

-verbose:class

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



 类似资料:
  • 我正在尝试使用Mockito为我的api调用创建单元测试(通过改装2.0实现)。 这似乎是使用和的最受欢迎的博客。 http://mdswanson.com/blog/2013/12/16/reliable-android-http-testing-with-retrofit-and-mockito.html 遗憾的是,它使用的是早期版本的改装,并且依赖于从2.0中断的回调和改装错误。 您如何使用

  • 问题内容: 我有一个使用自动装配的3个不同类的A类 在测试它们时,我只希望将其中两个类(B&C)作为模拟,并让D类在正常运行时可以自动装配,但此代码对我不起作用: 甚至有可能这样做吗? 问题答案: 应该是这样的 如果您不想成为别人,则无需在课堂上做任何事情。您 应具有的正确实例。此外,我认为你需要使用的工作,用正确的设定。因为您没有使用,所以需要使用 MockitoAnnotations.init

  • 我一直在尝试运行一个简单的动态Web项目,并得到一个HTTP 500内部服务器错误,我不确定如何读取输出以了解需要做什么来补救这种情况。 运行项目时控制台的输出(运行index.htm时相同): 正在端口8080上启动预览服务器 模块:HelloWorld(/HelloWorld) 我使用的是Eclipse和Java1.8.0_71的最新版本 为了确保我也会发布web.xml文档

  • 我最近开始使用JMockit,对TDD和mocking非常陌生。我喜欢使用代码覆盖率来确保我已经测试了给定类/方法的所有行。 我在尝试JMockit(Delegate()功能)和代码覆盖率时遇到了以下错误。我包括通过和不通过的考试。 我不确定我是否做错了什么? 我想知道是否有其他人遇到过此问题,是否有任何解决方案或修复可用? 我甚至不确定这是JMockit问题还是EclEmma问题。谢谢 我的设置

  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做