JMockit: как избежать кода из конструкторов суперклассов - PullRequest
3 голосов
/ 03 февраля 2012

Мне нужно протестировать класс SportCar, который расширяет Car.Проблема в том, что когда я создаю тестируемый объект

SportCar car = new SportCar();

, он также вызывает конструктор из родительских классов, например, Car ().Эти конструкторы делают много вещей, имеют много зависимостей от окружения и нуждаются в большом количестве конфигурационных файлов, которых у меня нет, поэтому я хотел бы создать экземпляр SportCar без вызова унаследованных конструкторов.Решение, которое я знаю для этого, заключается в создании Mockup for Car, в котором я перезаписываю конструктор ($ init) и статический блок ($ clinit).Но теперь моя проблема в том, что произойдет, если в моей иерархии будет много классов (SportCar расширяет Car, расширяющий A, расширяющий B, расширяющий C ...), и я хочу избежать всех конструкторов?Должен ли я создавать Mocks для ВСЕХ предыдущих классов?

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 ]

4 голосов
/ 03 февраля 2012

Если вы используете jmockit, вам вообще ничего не нужно делать, так как все конструкторы суперкласса по умолчанию имитируются.В вашем методе юнит-теста вы можете просто сделать:

public void testMockedStuff(@Mocked final ClassToBeMocked instance) {

, чтобы все было высмеяно для вас.Вам даже не нужно создавать экземпляры самостоятельно.Затем вы можете изменить параметры аннотации, чтобы исключить методы, которые вы используете для проверки.

1 голос
/ 03 февраля 2012

Вы можете подавить родительский конструктор, используя PowerMock

suppress(constructor(EvilParent.class));

Однако, если вам нужно выполнить много юнит-тестов, возможно, стоит выяснить, как подделать окружениетакже.Или убедите других разработчиков позволить вам провести небольшой рефакторинг, чтобы как минимум внедрить сервис.

1 голос
/ 03 февраля 2012

Создайте защищенный конструктор "ничего не делать" в Car и имейте защищенный конструктор в SportsCar, который вызывает его и вызывает его из вашего тестового класса, который может увидеть этот конструктор кстати - он имеетпривилегии для этого.

Это можно считать небольшим натяжением шаблона "design for test".

...