2013-08-01 5 views
1

Я пытаюсь написать модульный тест, который включает использование устаревшего кода. Проблема заключается в том, что, как я могу сказать, устаревший код использует пару ключ/значение из файла свойств для инициализации одного из его конечных статических частных членов, и я не имею ни малейшего представления о том, где может быть этот файл свойств (весь приложение довольно велико).Смещение зависимости от файла свойства

Итак, в моем тесте, я хочу сделать что-то вроде этого (с помощью Mockito):

LegacyClass legacyClass = mock(LegacyClass.class); 

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

В LegacyClass.java, есть:

private static final int LEGACY_PROPERTY = 
    Integer.parseInt(LegacyPropertyManager.getProp("legacy.property.key")); 

Есть ли способ, чтобы написать тест, который использует этот унаследованный класс, даже если ключевое свойство он ищет не существует? Можно ли это как-то насмехаться?

+0

Добавить свой файл свойств для тестового тестирования, например [здесь] (http://stackoverflow.com/questions/1557562/does-junit-support-properties-files-for-tests) –

+0

@RobGarwood Но проблема в том, что что это унаследованный класс, который использует свойство - как бы заставить LegacyClass использовать свой собственный файл свойств при создании экземпляра вместо того, который был найден LegacyPropertyManager? – dashik

+0

@JeffBowman Умный действительно; хотя я не слишком уверен, как использовать 'mockStatic' для издевки' getProp', чтобы он использовал мой файл свойств. В моем модульном тесте я попытался издеваться над «LegacyPropertyManager», а затем настроил 'when (...). ThenReturn (...)' как в примере, к которому вы привязались, но похоже, что LegacyClass все еще использует оригинал. Был ли еще один шаг, который мне нужно сделать? – dashik

ответ

1

Возможно, вы не зашли так далеко без умной библиотеки, как PowerMock. Обратите внимание, что ваш LegacyClass.java инициализирует это свойство в статическом конечном поле, что означает, что инициализатор будет запускаться сразу после его загрузки. PowerMock использует более глубокую магию (читай: байт-код манипуляции), чтобы вы могли указать mock the staticgetProp method, который вы указали выше.

Вам нужно сделать следующее, чтобы начать работу с PowerMockito:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(LegacyPropertyManager.class) 
public class YourClass { 

    @Before public void stubLegacyPropertyManager() { 
    Mockito.when(LegacyPropertyManager.getProp("legacy.property.key")) 
     .thenReturn("42"); 
    } 

    @Test public void yourTest() { 
    // ... 
    } 
} 

Примечания аннотации класса уровня, которые, соответственно, позволяют для инициализации PowerMock и зарегистрировать правильный класс для статического уровня насмешек.

1

Пример издевательства файла свойств, полностью игнорируя, где он будет, следующим. Вы можете создать свой собственный набор пар ключ/значение прямо в объекте metched properties.

Properties mockProperties = mock(Properties.class); 
when((mockProperties.getProperty("keyName"))).thenReturn("value"); 

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

Если вы не можете улучшить устаревший код, я знаю, что вы можете рисковать в области частичных mocks/spies (Mockito 1.8), как описано в следующем сообщении. Mockito bypass static method for testing и его ссылка на Effective Mockito. Я не использовал их, поэтому не могу больше помочь. Удачи.

+0

Полезно знать, но, к сожалению, мне не разрешено касаться устаревшего кода класса. – dashik

+0

Если вам не разрешено касаться кода класса, то что вы будете делать, если ваше тестирование выявит ошибку в этом коде? –

+0

А как раз для того, чтобы прояснить ситуацию, я не тестирую устаревший код.Он использовался с конца 90-х (хотя и плохо написан по сегодняшним стандартам), поэтому мы знаем, что он функциональный. Мне просто нужно было написать класс (и модульный тест), который использует этот старый код, но его плохая конструкция дала мне время от времени издеваться над ним. Я попросил моего босса получить разрешение на рефакторинг, и он сказал, что попытается что-то предпринять. – dashik

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