对尝试使用 Nullpointer 的方法进行单元测试



我正在测试类似于以下内容的方法:

car.driveCar("carName", problematicMethod().getBrand());

problematicMethod()是处理安全上下文的单一实例。通常,problematicMethod()不会返回 Null指针,但在单元测试中,它会返回。我无法更改该方法的源代码,并且由于其设计,无法用 Mockito 模拟它。 driveCar()不返回任何内容。

我已经尝试了以下内容,看看它是否会完全抑制该行的评估:

Mockito.doNothing().when(car).driveCar(Mockito.eq("carName"), Mockito.any());

但它仍然给了我一个 Nullpointer 异常,因为它试图计算第二个参数。

Mockito无法解决您的问题:

   car.driveCar("carName", problematicMethod().getBrand());
// [1] [5]      [2]        [3]                 [4]

Java的求值顺序保证了对problematicMethod()的调用会在调用driveCar之前发生,所以Mocking driveCar不会阻止对problematicMethod的调用。虽然你知道 Mockito 会导致对driveCar的调用不执行任何操作,但 Java 运行时无法知道这一点。


您可以尝试重构对 problematicMethod().getBrand() 的调用,然后针对覆盖或 Mockito 间谍进行测试:

public class YourClass {
  public ReturnType yourMethod() {
    car.driveCar("carName", getBrand());
  }
  /** Gets brand via problematicMethod(). Package private for test overrides. */
  Brand getBrand() {
    return problematicMethod().getBrand();
  }
}

(请注意,此技术也可以应用于整个 driveCar 方法调用,如果您有足够的实现来保证 Strategy 模式,则可以将其提取到它自己的对象中。

您将"problemMethod(("描述为单例。 方法不是单例。 类可以是单例。

我认为你的意思是,这个类实现了你无法分离的多个关注点,因此你必须在模拟其他方法的同时测试一些方法。

假设这是真的,你将不得不在Mockito中使用"间谍"概念。 阅读有关间谍的 Mockito 文档。 这将使你的测试更加混乱,更难理解,但你已经在课堂上做到了这一点。 :)

相关内容

  • 没有找到相关文章

最新更新