嘲笑EntityManager时出现Mockito问题



我正在用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的类进行单元测试时,你可以很容易地模拟它。这应该可以解决你的问题。

如果这个答案还不够清楚,请随意评论。

相关内容

  • 没有找到相关文章

最新更新