【问题标题】:Persisting a mocked object with junit and easymock使用 junit 和 easymock 持久化一个模拟对象
【发布时间】:2012-07-16 21:29:35
【问题描述】:

所以我在单元测试时使用了 easymock 来模拟我的数据层对象。 我正在使用 JPA 来实现持久性。例如。项目项目 = EasyMock.cre..(Project.class);等等

现在我想测试的方法让这个项目做一些事情,然后调用persist(project)。 project 是一个模拟对象,所以它在这里抛出错误。我的经理告诉我,因为您只想测试该方法的功能。 db 的返回值不是 imp 这就是为什么你应该使用模拟而不是真正的 db。那么如果这个方法有persist方法调用,我该怎么办呢?

谢谢。

【问题讨论】:

  • 取决于您要测试的内容。
  • 我不想测试它是否被持久化了。考虑一下我只是想测试这些方法是否被正确调用。

标签: java unit-testing easymock


【解决方案1】:

您应该嘲笑实体管理器而不是实体。

实体只是一个你可以轻松创建的pojo,你需要查看是否在实体管理器上调用了persist。

Edit

看起来您正在通过静态方法在类下的测试中创建实体管理器的实例。没有简单的方法来模拟它。

您应该使用dependency injection 将实体管理器传递给使用它的对象。然后,您可以只传递模拟实例,而不是传递真正的实现。

所以你的代码看起来像:

Project project = ...    

EntityManager manager = EasyMock.createStrictMock(EntityManager.class); 
ClassUnderTest test = new ClassUnderTest(manager)

//You expect this to be called    
manager.persist(project);

EasyMock.replay(manager);

//The method you are testing
test.save(project);

EasyMock.verify(manager);

(我有一段时间没有使用easymock,所以方法可能不太正确。)

【讨论】:

  • 谢谢,我想这就是我需要的。所以对于我的实体经理,我目前有这样的东西:EntityManager entityManager = Persistence.createEntityManagerFactory("AutomationCreatePU").createEntityManager();您能否再解释一下我如何模拟实体管理器。或者任何链接?谢谢。
  • @Sara - 使用与创建模拟项目相同的方法并将其传递给被测类。
  • 谢谢一堆。我会试试然后回复你。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多