【问题标题】:Java How to call a method from another mock methodJava 如何从另一个模拟方法调用方法
【发布时间】:2015-12-16 14:51:44
【问题描述】:

是否可以从另一个模拟方法调用某些方法,而不是使用 Mockito 或 PowerMock 返回值?

这里是一个明确的例子:

我在生产类中有一个查询:

session.createQuery("update clause")
                    .setParameter("")
                    .executeUpdate();
session.flush();

在我的测试课中,我这样模拟它:

Query q = mock(Query.class, "q");
when(session.createQuery("update lalala")).thenReturn(q);
when(q.executeUpdate()).thenReturn(something);

现在我需要调用位于我的测试类中的 void 方法来模拟数据库行为,而不是执行 thenReturn(something)。

即

public void doSomething()
{
  // do smth
}

所以在我的测试中,当 q.executeUpdate 被调用时,doSomething() 也会被调用。

我搜索了任何可能的想法,但似乎无法弄清楚。

【问题讨论】:

    标签: java unit-testing mockito powermock powermockito


    【解决方案1】:

    您可以使用thenAnswer 函数。见documentation

    when(q.executeUpdate()).thenAnswer( new Answer<Foo>() {
        @Override
        public Foo answer(InvocationOnMock invocation) throws Throwable {
          callYourOtherMethodHere();
          return something;
        }
    } );
    

    【讨论】:

    • 非常感谢!这正是我所需要的!我昨天尝试弄乱自定义答案,但似乎我做错了。
    • 这在 Alexandra 询问的情况下不起作用。她特别说她需要存根一个 void 方法,但这仅适用于非 void 方法。您需要使用doAnswer 语法来设置您的答案。幸运的是,您提供的链接是指向正确方法的链接。
    【解决方案2】:

    你可以用 EasyMock 做这样的事情(也许也可以用其他模拟工具)。

    Query q = createMock(Query.class)
    expect(q.createQuery("update lalala")).andDelegateTo(anObjectThatCalls_doSomething);
    ...
    

    【讨论】:

    • 不幸的是,我不能在这个项目中使用 EasyMock,只能使用 Mockito 或 PowerMock
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多