3

我需要测试一个扩展 Car 的类 SportCar。问题是当我创建被测对象时

SportCar car = new SportCar();

它还将调用父类的构造函数,例如 Car()。那些构造函数做了很多事情,有很多环境依赖,需要很多我没有的配置文件,所以我想创建一个 SportCar 的实例而不调用继承的构造函数。

我知道的唯一解决方案是为 Car 创建一个 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(){
}
4

3 回答 3

4

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

public void testMockedStuff(@Mocked final ClassToBeMocked instance) {

为你嘲笑一切。您甚至不必自己创建实例。然后您可以修改注释参数以排除您正在模拟的方法。

于 2012-02-03T15:11:25.620 回答
1

您可以使用PowerMock抑制父构造函数

suppress(constructor(EvilParent.class));

但是,如果您必须进行大量单元测试,则可能值得弄清楚如何伪造环境。或者说服其他开发人员让您进行一些重构以至少允许服务注入。

于 2012-02-03T13:57:01.247 回答
1

在其中创建一个受保护的“什么都不做”构造函数,Car并在其中调用一个受保护的构造函数SportsCar并从您的测试类中调用它,顺便说一句,它可以看到该构造函数-它有权这样做。

这可以被认为是“测试设计”模式的轻微延伸。

于 2012-02-03T13:25:09.830 回答