我正在测试类似于以下内容的方法:
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 文档。 这将使你的测试更加混乱,更难理解,但你已经在课堂上做到了这一点。 :)