【问题标题】:How to call Mockito.given with private method如何使用私有方法调用 Mockito.given
【发布时间】:2016-03-23 10:12:25
【问题描述】:

我找到了使用 ReflectionUtils 的方法

Method myMethod=ReflectionUtils.findMethod(myMockClass.getClass(), "myMethod", myArg.class)

现在我想驱动这个方法返回一个指定的值。通常,如果myMethod 是公开的,我会写例如

given(myMockClass.myMethod(myArg)).willReturn(5)

但是有没有可能使用私有 myMethod 来做到这一点?
当我打电话时

given(myMethod.invoke(myClass, myArg)).willReturn(5)    

我有 java.lang.reflect.InvocationTargetException。 我已经阅读过有关 PowerMock 的信息,但我想知道仅使用 Mockito 是否可行

编辑:

public int A(args){
  int retValue;
  ... some code here, the most important part
  retValue=..
  if(some case)
      retValue= myMethod(args);
  return retValue;
}

【问题讨论】:

  • 首先,你要考什么课?包含“A”方法的类? “我的方法”有什么作用?我的意思是,该方法如何调用另一个类?它使用“新”还是静态调用?

标签: java unit-testing junit mockito


【解决方案1】:

考虑在这里使用Guava's @VisibleForTesting注解。基本上,只需将方法的可见性提高到测试它所需的最低级别。

例如,如果你原来的方法是:

private int calculateMyInt() {
  // do stuff
  return 0;
}

你的新方法是:

@VisibleForTesting // package-private to call from test class.
int calculateMyInt() {
  // do stuff
  return 0;
}

【讨论】:

  • 有趣。以前从未见过。谢谢!
【解决方案2】:

我建议你不要这样做。 如果您需要模拟私有方法的行为,那么您的设计就会出现问题。您的课程不可测试。

解决方法是将您的方法包设为私有,并在同一个包中对其进行测试。这会起作用,但也不是好的做法。

我建议阅读最新的Uncle's bob article

【讨论】:

  • 感谢您的评论,我会考虑的。我的情况如下(编辑),我有方法 A,其中有一些功能,在这种方法中,我在一种情况下调用 myMethod。 myMethod 是私有的,它调用另一个类。我想编写单元测试,所以我不想关注另一个类中发生的事情,因为它是不同的测试,在这种情况下我想返回一些值。
  • 也许我错了,但让我们举个例子,我们有一个类,我们做了很多事情,包括调用方法A,我们使用特定算法计算一些值,这个方法A是私有的,而不是没关系,我们只测试这个算法
【解决方案3】:

不要犹豫,将方法可见性更改为包保护,即使它只是为了测试目的(通常是因为您想测试该方法或因为您想模拟它)。不过,您应该清楚地表明这一事实,一个好方法是使用注释(请参阅this answer)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2011-05-01
    相关资源
    最近更新 更多