【问题标题】:How to mock @PrePersist method?如何模拟@PrePersist 方法?
【发布时间】:2014-07-10 09:37:56
【问题描述】:

如何模拟 @PrePersist 方法,例如preInit(),我实例化的实体?

我正在使用 TestNG。首选 EasyMock。

@Test(enabled = true)
public void testCreateOrder() {
     // Instantiating the new mini order will automatically invoke the pre-persist method, which needs to be mocked/overwritten!
     MiniOrder order = new MiniOrder();
     order.setDate(new Date());
     order.setCustomerId(32423423);
}

MiniOrder.java 是一个具有 pre-persist 方法的实体。同样,我喜欢模拟/覆盖的那个。例如。 this.id = 1;或者,也可以模拟 IdGenerator.getNewId() 方法。

@PrePersist
protected void preInit(){
    this.id = IdGenerator.getNewId();
}

我不希望调用 IdGenertor 类,因为它试图获取 jndi 资源。我只是不明白如何提前捕获这个pre-persist方法,以便在对象完全实例化之前不会触发它,分别替换为不同的代码。

【问题讨论】:

  • 那么你到底想测试什么?您想测试标记为@PrePersist 的方法中包含的功能吗? (您没有在问题中提供该方法,因此很难提供帮助。)或者您是否尝试在执行持久操作时测试调用 @PrePersist 方法?
  • @DanTemple 谢谢。我改写了。我想避免调用 pre-persist 方法中的 IdGenerator。但是,id 必须以其他方式设置。
  • 我认为如果在 MiniOrder 的构造过程中调用 preInit,您将无法模拟对 preInit 的调用,但您应该可以使用 PowerMock 模拟静态方法调用到IdGenerator.getNewId()。看看documentation 看看这是否对您有帮助。

标签: jpa mocking mockito easymock jmockit


【解决方案1】:

在这种情况下,您真正​​想要的是模拟 IdGenerator 依赖项,它恰好是从 @PrePersist 方法调用的。

使用JMockit,测试可以写成如下:

@Test
public void createOrder()
{
    new MockUp<IdGenerator>() {
        // change as needed...
        @Mock int getNewId() { return 123; }
    };

    MiniOrder order = new MiniOrder();
    order.setDate(new Date());
    order.setCustomerId(32423423);
}

【讨论】:

  • 是的,我就是这么做的 :)
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2014-06-07
  • 2019-09-08
相关资源
最近更新 更多