我正在测试类似于以下内容的方法:
car.driveCar("carName", problematicMethod().getBrand());
problematicMethod()
是一个处理安全上下文的单例。通常,problematicMethod()
不会返回Nullpointer,但在单元测试中,它会返回Nullpointer。我无法更改该方法的源代码,并且由于其设计,无法使用Mockito进行模拟。 driveCar()
不返回任何内容。
我已经尝试了以下内容,看看它是否会完全取消对该行的评估:
Mockito.doNothing().when(car).driveCar(Mockito.eq("carName"), Mockito.any());
但它仍然给我一个Nullpointer异常,因为它试图评估第二个参数。
答案 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}},则可以将其提取到自己的对象。)