我需要测试一个类CarCar,它扩展了Car。问题是当我在测试中创建我的对象时
SportCar car = new SportCar();
它还将从父类调用构造函数,例如Car()。那些构造函数做了很多事情,有很多环境依赖,需要很多我没有的配置文件,所以我想在不调用继承构造函数的情况下创建一个SportCar实例。
我知道的唯一解决方案是创建一个Carock Mockup,其中我覆盖构造函数($ init)和静态块($ clinit)。但现在我的问题是,如果我的层次结构中有很多类会发生什么(SportCar扩展Car扩展A扩展B扩展C ...)我想避免所有构造函数?我应该为之前的所有课程创建模拟吗?
class A extends B{
public A(){
// Plenty of things to avoid during tests
}
}
class Car extends A{
public Car(){
// Plenty of things to avoid during tests
}
}
class SportCar extends Car(){
}
答案 0 :(得分:4)
如果您正在使用jmockit,则根本不需要执行任何操作,因为默认情况下会模拟所有超类构造函数。在您的单元测试方法中,您可以这样做:
public void testMockedStuff(@Mocked final ClassToBeMocked instance) {
让嘲笑你的东西。您甚至不必自己创建实例。 然后,您可以修改注释参数以排除您正在进行模拟的方法。
答案 1 :(得分:1)
在Car
中创建受保护的“不执行任何操作”构造函数,并在SportsCar
中设置一个受保护的构造函数来调用它并从您的测试类中调用它,可以看到它构造函数顺便说一句 - 它有权这样做。
这可以被认为是“测试设计”模式的一小部分。
答案 2 :(得分:1)
您可以使用PowerMock
来取消父构造函数suppress(constructor(EvilParent.class));
但是,如果你必须进行大量的单元测试,那么也可能需要弄清楚如何伪造环境。或者说服其他开发人员让你做一些重构,至少允许服务注入。