我正在用Mockito编写一些单元测试,当我试图模拟EntityManager并运行单元测试时,它会出现以下错误:
java.lang.ClassFormatError:方法中缺少类文件javax/persistence/LockModeType中非本机或抽象的Code属性位于java.lang.ClassLoader.defineClass1(本机方法)……
堆栈跟踪指向我有以下代码的行:
private EntityManager entityManager = mock(EntityManager.class);
非常感谢您的帮助。
Flavio
下面的链接可能会回答您的问题。
受损的javaee
不要模拟您不拥有的类型,尤其是实体管理器,而是编写集成测试。您可以使用Arquilian、H2等工具来帮助编写这些集成测试。
的进一步读数
- http://davesquared.net/2011/04/dont-mock-types-you-dont-own.html
- 你应该只模拟你自己的类型吗
- 著名且必读的书籍《测试引导下的面向对象软件成长》
对不起,我真的没有帮你回答这个问题,但嘲笑你不拥有的类型真的是个坏主意。
从您的问题中还不清楚EntityManager
是您自己的类之一,还是外部库中的某个类。
如果是前者,我建议你在这里发布它的代码,这样我们都可以看到问题所在。否则,我们只是猜测。
如果是后者,我的下一个问题是您是否在使用包装器类。也就是说,您应该考虑编写一个名为EntityManagerWrapper
(或类似的类)的类,该类将EntityManager
作为字段,并公开您希望使用的EntityManager
的所有方法。EntityManagerWrapper
的每个方法应该只有一到两行长,除了调用EntityManager
的正确方法之外什么都不做。然后重构所有使用EntityManager
的代码,使其使用EntityManagerWrapper
。
不需要对EntityManagerWrapper
进行单元测试,因为它不包含自己的逻辑。然而,当你对其他使用EntityManagerWrapper
的类进行单元测试时,你可以很容易地模拟它。这应该可以解决你的问题。
如果这个答案还不够清楚,请随意评论。