2014-02-18 2 views
5

Мы используем powermock для издевательств статических методов с помощью аннотаций @PrepareForTest. Тест работает нормально, но проблема в том, что для выполнения теста требуется больше времени.Тесты Powermock JUnit занимают больше времени для выполнения по сравнению с обычным JUnit

Фрагмент кода, как показано ниже:

@PrepareForTest({ StaticClass1.class, StaticClass2.class }) 

Обычно JUnit с вне насмешливый статический метод принимает около 2 раз сек для выполнения, но когда мы добавим @PrepareForTest аннотацию насмехаясь статические вызовы, тест занимает около минуты, чтобы завершить выполнение. Для одного теста это не оказывает большого влияния, но у нас более 1K тестов, а общее время сборки составляет более 2 часов, что раньше занимало около 20-30 минут.

Что может быть причиной того, что электростанция занимает столько времени.

Любая помощь была бы принята с благодарностью.

+2

приборы, выполненные powermock, не являются бесплатными. –

+0

Если вам нужны powermock для всех ваших тестов, у вас, вероятно, есть серьезные проблемы с дизайном. Попробуйте написать тестовый код, то есть код, который не нуждается в проверке черной магии powermock. Используйте инъекцию зависимостей. –

+0

Спасибо за быстрый ответ. Но можете ли вы, пожалуйста, сказать мне точно, как то, что вы подразумеваете под инструментами, не является бесплатным. – Srikanth

ответ

5

PowerMock - это инструмент, который работает с инструментами байт-кода на сгенерированных классах. После того, как ваши классы скомпилированы в Java Bytecode, PowerMock приходит и изменяет эти сгенерированные классы. В противном случае (с использованием Java Proxy) невозможно выполнить макет частного или статического метода.

Вы должны использовать аннотацию @PrepareForTest только в тех классах, которые вы хотите использовать исключительно для PowerMock, например, издевательские частные или статические методы.

+0

Спасибо за ваше объяснение аппаратуры powermock. Я использую аннотацию @PrepareForTest только для издевательства вызовов конструктора, частных методов и статических методов. – Srikanth

+0

Кроме того, в одном тесте, если я издеваюсь над статическим классом, скажите StaticClass1 в Test1. Теперь в Test2, если я хочу издеваться над тем же статическим классом, тогда powermock использует отдельный JVM для поддержания этих статических вызовов. Я беспокоюсь, что если я издеваюсь за этими статическими вызовами один раз для всего пакета, то он должен быть повторно использован во всех тестовых классах, где этот статический макет звонка используется. Есть ли способ реализовать это? – Srikanth

+0

@Srikanth Это отдельный вопрос. Возможно, вам придется рассмотреть возможность разворачивания вашей JVM для каждого тестового класса: http://stackoverflow.com/a/1332135/207238 –

Смежные вопросы