Тестирование конструкторов с помощью powermock

Кто-нибудь знает, как в powermock вы можете модульно протестировать конструктор и издеваться над методами, которые вызывает конструктор.

то есть у меня есть такой класс;

public class myClass {
    public myClass(){
        myMethod();
        // do other stuff
    }
    public void myMethod(){
        // do stuff
    }
}

Что я хочу сделать, так это написать модульный тест для конструктора myClass(), который издевается над myMethod().

Это было бы легко, если бы myMethod() был статическим, поскольку я мог бы использовать mockStaticPartial(), а затем вызывать конструктор.

Простое создание частичного макета MyClass также не будет работать, так как после того, как я создал макет, я его создал, вызов конструктора в этот момент просто создаст новый экземпляр MyClass без издевательства над myMethod().

Кто-нибудь знает какие-нибудь способы?


person mpc    schedule 13.09.2012    source источник
comment
вы, должно быть, начали TDD поздно в своем проекте...   -  person user1329572    schedule 13.09.2012
comment
Кстати, вызывать публичный нефинальный метод из вашего конструктора — дурной тон. Сделайте метод закрытым или окончательным. stackoverflow.com/ вопросы/3404301/   -  person John Ericksen    schedule 13.09.2012
comment
Хорошо, скажем, я делаю метод, вызываемый из конструктора, закрытым, я все равно хотел бы издеваться над ним. Мой пример был всего лишь небольшим фрагментом кода, который я собрал, чтобы проиллюстрировать, что я пытаюсь сделать — смоделировать метод, вызываемый из конструктора, с помощью powermock.   -  person mpc    schedule 17.09.2012


Ответы (1)


Вы не должны издеваться над тестируемым классом. Если конструктор вызывает метод, то действия метода должны быть проверены как часть тестирования конструктора. Если метод делает что-то, что выходит за рамки модульного тестирования, смоделируйте классы, которые этот метод использует для выполнения «материала».

Если вы ДЕЙСТВИТЕЛЬНО хотите сделать это с тем, что у вас есть выше (я не рекомендую это), вы можете создать подкласс вашего тестируемого класса, который переопределяет метод. (это противоречит превосходному комментарию johncarl выше).

person John B    schedule 13.09.2012
comment
С powermock вполне разумно частично имитировать тестируемый класс, на самом деле это одно из основных преимуществ powermock. Создание подкласса и методы переопределения - это то, что делает powermock при создании частичных макетов, и это все еще оставляет мне проблемы, описанные в моем вопросе. - person mpc; 17.09.2012
comment
Проблема, с которой вы сталкиваетесь, заключается в том, что фиктивные фреймворки создают прокси-сервер-оболочку. Однако, оказавшись внутри имитируемого экземпляра, когда он вызывает один из своих собственных методов, он не выходит и не классифицирует повторный вход, тем самым проходя через прокси. Следовательно, даже со шпионским механизмом Mockito, который позволяет заглушить метод экземпляра, это не сработает, поскольку заглушаемый метод вызывается из отслеживаемого экземпляра. Я повторяю решение подкласса и переопределения. - person John B; 17.09.2012
comment
Хм, я думаю, я надеялся, что с загрузчиком классов powermock будет какой-то способ смоделировать вызов метода в конструкторе, прежде чем вы создадите сам объект. Возможно, вы правы, и переопределение метода — единственный путь вперед. Предположим, это что-то, что просто невозможно сделать в Power Mock, спасибо за вашу помощь! :-) - person mpc; 17.09.2012