单元测试尝试使用Nullpointer的方法

时间:2016-02-17 16:48:37

标签: java spring nullpointerexception mockito

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

您将“problematicMethod()”描述为单身人士。方法不是单身人士。课程可以是单身。

我认为你所说的是这个类实现了你无法分离的多个问题,因此你必须在模拟其他方法时测试一些方法。

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

答案 1 :(得分:0)

Mockito无法解决您的问题:

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

Java的order of evaluation保证在调用problematicMethod()之前调用driveCar,因此模拟driveCar将无法阻止对{{1}的调用}。虽然你知道Mockito会导致调用problematicMethod什么也不做,但Java运行时无法知道。

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

problematicMethod().getBrand()

(请注意,此技术也可以应用于整个public class YourClass { public ReturnType yourMethod() { car.driveCar("carName", getBrand()); } /** Gets brand via problematicMethod(). Package private for test overrides. */ Brand getBrand() { return problematicMethod().getBrand(); } } 方法调用,如果您有足够的实现来保证{​​{3}},则可以将其提取到自己的对象。)