JMockit:如何避免超类的构造函数中的代码

时间:2012-02-03 13:20:59

标签: java junit hierarchy jmockit

我需要测试一个类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(){
}

3 个答案:

答案 0 :(得分:4)

如果您正在使用jmockit,则根本不需要执行任何操作,因为默认情况下会模拟所有超类构造函数。在您的单元测试方法中,您可以这样做:

public void testMockedStuff(@Mocked final ClassToBeMocked instance) {

让嘲笑你的东西。您甚至不必自己创建实例。 然后,您可以修改注释参数以排除您正在进行模拟的方法。

答案 1 :(得分:1)

Car中创建受保护的“不执行任何操作”构造函数,并在SportsCar中设置一个受保护的构造函数来调用它并从您的测试类中调用它,可以看到它构造函数顺便说一句 - 它有权这样做。

这可以被认为是“测试设计”模式的一小部分。

答案 2 :(得分:1)

您可以使用PowerMock

来取消父构造函数
suppress(constructor(EvilParent.class));

但是,如果你必须进行大量的单元测试,那么也可能需要弄清楚如何伪造环境。或者说服其他开发人员让你做一些重构,至少允许服务注入。