gpt4 book ai didi

jetty - 功能测试中的 JMockit + Jetty

转载 作者:行者123 更新时间:2023-12-04 20:45:20 26 4
gpt4 key购买 nike

我在集成测试中使用 ShrinkWrap 启动 Jetty 服务器。

问题:

当我启动我的测试 jetty 服务器而不是制作我的 Controller 模型时 - 模型不起作用!
我认为原因是不同的类加载器:JMockit - AppClassLoader,Jetty - WebAppClassLoader。

问题:

如何使模拟工作正常?

附言
我在谷歌上搜索过 -javaagent:jmockit.jar 选项可能会有所帮助。但事实并非如此。基于1.7 jdk的maven项目有必要吗?

附加:

我写了演示来说明我的问题。您可以通过 reference 找到它.

关于我的演示:

除十斯托克斯代码外,与those project相同.
我只添加了 JMockit 和一个模拟来说明问题。

您应该看到 JettyDeploymentIntegrationUnitTestCase.requestWebapp 方法:在这些方法中,我们制作了不起作用的模拟。

您可以检查 Jetty & JMockit 是否通过兄弟类加载器加载类,因此 JMockit 根本看不到 Jetty 的类

URLClassLoader
|
|-Launcher$AppClassLoader
|-WebAppClassLoader

最佳答案

示例项目中的 JUnit 测试试图模拟 ForwardingServlet类(class)。但是,在这个带有嵌入式 Jetty Web 服务器的场景中,实际上有这个类的两个实例,它们都加载在同一个 JVM 中,但通过不同的类加载器。

类的第一个实例由常规类加载器加载,通过它从启动 JUnit 测试运行程序的线程 ( AppClassLoader ) 加载类。所以,当 ForwardingServlet出现在测试代码中,它是在这个类加载器中定义的。这是给 JMockit 进行模拟的类,这正是发生的事情。

但是,ForwardingServlet的副本使用 Jetty 的 WebAppClassLoader 加载到部署的 Web 应用程序中(来自文件系统中的“.class”文件,因此不受 JMockit 应用的模拟影响,仅在内存中) . JMockit 从未见过这个类。

这个问题有两种可能的解决方案:

  • 以某种方式获取 WebAppClassLoader 加载的类对象然后通过调用 MockUp(Class) 来模拟它构造函数。
  • 配置 Jetty 服务器,使其不对 Web 应用程序中的类使用自定义类加载器。

  • 第二种解决方案是最简单的,只需在 ContextHandler 上添加以下调用即可完成。从 WebArchive 创建的对象对象,在将处理程序设置到 Jetty 之前 Server目的:
    handler.setClassLoader(ClassLoader.getSystemClassLoader());

    我对此进行了测试,它按预期工作,使用 @Mock doGet(...) ForwardingServlet 中的方法被执行而不是真正的方法.

    关于jetty - 功能测试中的 JMockit + Jetty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18896657/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com