2017-01-20 2 views
0

для извлечения некоторых данных из унаследованного приложения, в настоящее время я использую powermock для подготовки нескольких довольно запутанных классов и замены нескольких зависимостей с помощью mocks.Powermock без JUnit

Таким образом, у меня есть тест JUnit, который по существу делает:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(LegacyDependency.class) 
public class ThisIsNotReallyATest { 
    @Test 
    public void extractData() { 
     ... prepare and wire mocks 

     // new ClassUnderTest() will essentally call LegacyDependency.getInstance() 
     Object result = new ClassUnderTest().doSomething(); 
     // save result for later reference 
    } 
} 

Таким образом: это не тест. Это класс утилиты, который использует функции Powermock, чтобы обойти различные сильно моделируемые зависимости.

Как с помощью тестовой основы для создания утилита, которая не подключена к блоку тестирования вообще заставляет меня чувствовать себя очень плохо, вопрос:

Могу ли я использовать powermock (особенно на функцию PrepareForTest для статического/окончательны./etc.) в автономном программном обеспечении? Если да: как?

+0

Вы неправильно используете рамки для чего-то, для чего не предназначены. Если у вас есть контроль над исходным кодом устаревшего приложения, вы должны его реорганизовать, а затем сделать это. Готовы ли вы к сбоям проверки байт-кода в производстве? (да, это то, что может принести вам powermock) – rkosegi

+0

Речь идет о инструменте, который является частью подготовки базового теста для предстоящего рефакторинга. Это просто для временного использования, очищая часть этого беспорядка. – mtj

+1

Кажется, что вы просто используете замену/генерацию байт-кода runtime в Powermock. Почему бы вам просто не использовать Javassist или ByteBuddy и так далее? –

ответ

1

ИМХО, вопрос является X/Y problem, но

Допустим, конструктор ClassUnderTest является:

ClassUnderTest() { 
    this.legacyDep = LegacyDependency.getInstance(); 
    // ... 
} 

И что вы не хотите, чтобы некоторые LegacyDependency поведение, вы могли бы сделать некоторые рефакторинга, как что:

// you can provide your own "LegacyDependency" that does nothing or something 
ClassUnderTest(LegacyDependency legacyDep) { 
    this.legacyDep = legacyDep; 
    // ... 
} 

// old way 
ClassUnderTest() { 
    this(LegacyDependency.getInstance()); 
    // ... 
} 
+0

Нет, эта часть вопроса «как я могу исходить от X до Y». Первоначально я не упомянул о том, что мы говорим о бизнес-критическом приложении реального мира с примерно миллионными линиями кода. Я бы * хотел * реорганизовать его, но мне понадобилась бы полная команда схватки примерно на год, чтобы сделать это. Прямо сейчас, я просто хочу извлечь некоторые данные из метода, который не может быть вызван, если остальная часть приложения не работает и не работает при обычных обстоятельствах. – mtj

+0

Здесь есть что-то странное, если вы можете использовать Powermock для подавления какого-либо поведения, вы можете реорганизовать, как я уже сказал. Так что, возможно, вы должны отредактировать свой вопрос и опубликовать более «конкретный» код. –

+0

Благодарим вас за попытку решить эту проблему под другим углом. Да, рефакторинг был бы возможен, если бы я был готов внести изменения, включающие около 200 измененных вызовов конструктора прямо сейчас. Не я. Речь идет о получении некоторой базовой информации для * подготовки * более позднего рефакторинга. Таким образом: объект наблюдения * не должен изменяться * в это время. Я просто оставлю этот комментарий здесь, пока я не удалю этот вопрос. – mtj

0

Я согласен с комментарием @ rkosegi - вы злоупотребляете PowerMock для целей который он не предназначен.

Однако я понимаю, что вам нужно использовать охлаждающие функции PowerMock. К сожалению, они очень тесно связаны с возможностями тестирования, которые вам не нужны. Поскольку бегун PowerMock инициализирует тестовую среду в разных загрузчиках классов и настраивает некоторые классы перед тем, как помещать их в эту среду, вы можете имитировать работу PowerMock, чтобы сделать то же самое, без необходимости в тестовом классе, аннотации и т. Д.

В моем blog (в Czech), я показал, как использовать внутренние компоненты Powermock для получения имени метода для данной ссылки метода. Это было не так удобно, как Powermockito (на самом деле это было очень болезненно), но в ретроспективе вам нужно всего лишь 1. повторно использовать загрузчик классов, 2. выполнить работу класса загрузчика (настройка вашего ClassUnderTest в Javassist), 3. прибыль :-)

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

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