【问题标题】:EasyMock when we have a call to db on the test class当我们在测试类上调用 db 时,EasyMock
【发布时间】:2012-07-16 23:32:26
【问题描述】:

我正在使用 JUnit 测试一个类,比如说 MyClass。我正在使用 easymock 来隔离对 db 的需求。它工作正常。因此,如果有对模型对象的调用,我只是模拟该对象。 例如。如果我有

public void method(Project project) { project.getName(); ..}

在 MyClass 中,我只使用 mockedProject。然后我说 MyClass.method(mockedProject); 但是如果我在 MyClass 中有 this.getName() 怎么办。在这种情况下,由于我想要我正在测试的类(MyClass)的真实对象,我无法模拟 MyClass 对象。所以我不能为 MyClass 对象定义返回值,因为它是一个真实的对象。请记住,getName() 会扔掉我不希望它扔掉的数据库。

当我有 this.method() 并且该方法与 db 一起使用时,在这种情况下我应该怎么做。 我无法模拟我正在测试的这个对象。 谢谢。

【问题讨论】:

  • 你能告诉我们访问数据库的方法吗?

标签: java junit easymock


【解决方案1】:

如果您能够模拟用于访问 DB 的类,然后执行此操作,然后 this.getName() 将使用模拟的类并获取您定义的任何数据。

如果不能模拟数据库访问类,那么你就什么也做不了。

更新:

测试 JPA 实体可能会有点棘手,如果您可以模拟实际实体,那么无论如何,去尝试它并让它返回您喜欢的任何内容,而不是 DB 结果。但我不确定这是否可能。

我建议您查看herehere 以获得更详细的示例。

【讨论】:

  • 我正在使用 JPA 并且我有实体类。模拟类是指模拟具有 db 列的 getter 和 setter 的实体类吗?这也是一个不打算显式访问 db 而是抛出对实体类的调用的类。但是在这个 getName() 方法中,我写了一个对 db 的查询。而“This”是我想要测试其功能的类,所以我还应该模拟它吗?
  • 嗯,你是什么意思?我只有用于 ORM 的实体类+xml 文件。我没有使用实体管理器。
  • 你在使用像 Hibernate 这样的框架吗?还是直接使用 JPA?
  • 是的,我正在使用 Hibernate。在 getName() 方法中,我有一个休眠条件。
【解决方案2】:

您应该模拟在 MyClass.getName() 中访问数据库的类(例如 EntityManager)并记录这些模拟所需的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多