【问题标题】:How do I mock java.lang.reflect.Method class in PowerMockito?如何在 PowerMockito 中模拟 java.lang.reflect.Method 类?
【发布时间】:2012-04-13 06:43:31
【问题描述】:

我有一个实现 InvocationHandler 的类,如下所示:

public class MyProxyClass implements InvocationHandler
{
  public Object invoke (Object proxy, Method method, Object[] args) throws Throwable
  {
    //Do something interesting here
  }
}

使用 PowerMock 和 Mockito,我试图在我的单元测试类中传递一个模拟方法对象:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Method.class})
public class MyProxyTest
{
  MyProxy underTest;

  @Test
  public void testInvoke() throws Throwable
  {
    Method mockMethod = mock(Method.class);
    //...
  }
}

由于方法是final,我已经完成了@PrepareForTest 的技巧,但这似乎并没有减少它。 这是因为它是自举的吗?我只是在处理这个错误吗?

我一直在查看以下链接,但那里没有确定的内容:

【问题讨论】:

    标签: unit-testing junit mocking mockito powermock


    【解决方案1】:

    使用 PowerMock,您可以模拟最终类,但是,尽管我不相信它已记录在案,但 java.lang 和 java.lang.reflect 包中的某些类您无法模拟,因为它们也是模拟框架如何工作的基础。

    我认为这些包括(但可能不限于)java.lang.Class、java.lang.reflect.Method 和 java.lang.reflect.Constructor。

    但是,您想做什么需要模拟方法?你可以很容易地创建一个真正的方法对象。您甚至可以在一个虚拟类上创建一个真正的方法对象,然后您可以检查它是否曾经被调用过以及使用什么参数。你只是不能使用 Mockito 和 Powermock 来做到这一点。看看你的问题是不是和this question类似。

    【讨论】:

    • 是的,它看起来像一个类似的问题。我最终走上了通常从模拟创建 Method 对象的路线,然后验证该方法是否在模拟上被调用。谢谢!
    猜你喜欢
    • 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
    相关资源
    最近更新 更多