3

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

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

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

private EntityManager entityManager = mock(EntityManager.class);

很感谢任何形式的帮助。

弗拉维奥

4

3 回答 3

4

可能是下面的链接回答你的问题。

残废的java ee

于 2012-12-18T11:00:15.147 回答
3

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

进一步阅读

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

于 2012-12-17T17:16:11.620 回答
0

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

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

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

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

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

于 2012-12-18T07:56:23.740 回答