你好,我有一段代码设计得不是很好,但我不是这段代码的所有者,所以无法更改。
public interface Car{ // This is a marker interface. }
public class BigCar implements Car{
public boolean isVeryBig(){
return true;}
}
public class QuiteBigCar implements Car{
public boolean isVeryBig(boolean withHatchBack){
return true;}
}
public Pickup implements Car{
public boolean isVeryBig(boolean withHatchBack, boolean withRoofRack){
return true;}
}
你只需要知道接口存在的意义在于让我知道 "BigCar","QuiteBigCar" 和 "Pickup" 都是 "Car"。虽然不是很聪明,但这就是我必须处理的问题。
现在我有一个方法,它接收一个汽车作为参数,并将返回一个模拟版本的汽车。 我希望该模拟版本能够确保每次调用 "isVeryBig()" 时,无论方法签名如何,都会返回 false。问题是,我没有一个通用的接口适用于所有的 "isVeryBig()" 方法;它们都有不同的签名。
public Car mockMyCar(Car car){
Car mockedCar = mock(car);
when(mockedCar.isVeryBig()) <-- This wont work since the method doesn't exist on the interface
return mockedCar;
}
是的,我可以将Car转换为它们的子类,但对我来说这不是一个选项,因为有太多实现Car的类,对所有实现进行instanceOf检查会使代码非常混乱,而且我不能控制未来的Car新实现。
有什么想法吗?
CarFixed
的接口来声明方法,然后创建一个AbstractCarFixed
类用于创建不同“实例”Car
的静态工厂方法。这样,你至少可以模拟CarFixed
。 - fgemock(car)
也无法编译。你是在做类似于mock(car.getClass())
或者spy(car)
这样的操作吗? - Michał Politowski