没有对象的 Mockito 方法调用

Mockito method call without object

代码类似于

Speed speed = readSpeed(Point A, Point B);
isOverLimit = limitCheck.speedCheck(speed);

如何使用 mockito 提高读取速度?

Mockito.when(readSpeed(0, 0).then...

假设我应该使用 class 对象来调用它?

Mockito 通过创建对象的单个子class 有效地工作,这些对象将每个可重写的实现委托给模拟框架。

因此,您不能使用 Mockito 一次模拟 所有实例的方法 (readSpeed) 在您的系统中创建的实例test,也不模拟任何静态或最终方法。如果 readSpeed 是其中任何一个,或者需要在您测试中未触及的实例上进行模拟,Mockito 将不适合您;你需要重构,或者使用 PowerMockito(它悄悄地重写你的被测系统以重定向构造函数、最终调用和对 Mockito 框架的静态调用)。

如果 readSpeed 是被测系统上的 public 非最终实例方法,那么您 可以 模拟它,那就是调用了组件的 partial mock。部分模拟可能有用,但也可以考虑 "code smells"(如 Mockito documentation 中所述):理想情况下,您的测试 class 应该是要测试的原子单元,模拟应该发生在dependencies around 你的被测系统而不是你的测试本身。否则,您可能很容易测试规范或测试模拟框架,而不是测试您的组件。

虽然更好的做法是将 class 拆分为更小的互连组件,但您可以像这样在 Mockito 中使用部分模拟:

@Test public void componentChecksSpeed() {
  YourComponent yourComponent = Mockito.spy(new YourComponent());

  // Use doReturn, because the when syntax would actually invoke readSpeed.
  doReturn(65).when(yourComponent).readSpeed(any(Point.class), any(Point.class));

  yourComponent.run();
}