【问题标题】:Issue with Mockito when mocking an EntityManager模拟 EntityManager 时出现 Mockito 问题
【发布时间】:2012-12-17 16:38:01
【问题描述】:

我正在使用 Mockito 编写一些单元测试,当我尝试模拟 EntityManager 并运行单元测试时,出现以下错误:

java.lang.ClassFormatError:类文件 javax/persistence/LockModeType 中非本机或抽象方法中的缺失代码属性 在 java.lang.ClassLoader.defineClass1(本机方法) ....

堆栈跟踪点在我有以下代码的那一行:

private EntityManager entityManager = mock(EntityManager.class);

非常感谢任何帮助。

弗拉维奥

【问题讨论】:

标签: java mockito


【解决方案1】:

下面的链接可能会回答您的问题。

crippled java ee

【讨论】:

    【解决方案2】:

    不要模拟你不拥有的类型,尤其是实体管理器,而是编写集成测试。您可以使用 Arquilian、H2 等工具来帮助您编写这些集成测试。

    进一步阅读

    对不起,我并没有真正帮助您回答这个问题,但是对于您不拥有的模拟类型来说,这确实是一个坏主意。

    【讨论】:

      【解决方案3】:

      从您的问题中不清楚EntityManager 是您自己的类之一,还是外部库中的某个类。

      如果是前者,我建议你在这里发布它的代码,这样我们就可以看到问题所在。否则,我们只是猜测。

      如果是后者,我的下一个问题是您是否使用了包装类。也就是说,您应该考虑编写一个名为EntityManagerWrapper(或类似名称)的类,该类具有EntityManager 作为字段,并公开您希望使用的EntityManager 的所有方法。 EntityManagerWrapper 的每个方法应该只有一两行长,除了调用EntityManager 的正确方法之外什么都不做。然后重构所有使用EntityManager 的代码,使其改用EntityManagerWrapper

      没有必要对EntityManagerWrapper 进行单元测试,因为它不包含自己的逻辑。但是,当您对使用它的其他类进行单元测试时,您可以轻松地模拟 EntityManagerWrapper。这应该可以解决您的问题。

      如果不够清楚必须做什么,请随时对此答案发表评论。

      【讨论】:

        猜你喜欢
        • 2014-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多