предисловие
Если вы уже читали какой-то другой пост в блоге о необычном насмешке, вы можете пропустить прелюдию по этой ссылке .
Меня попросили собрать воедино примеры, как макетировать Java-конструкции, хорошо известные по их проблемам с тестируемостью:
- Ложный частный метод
- Ложный финальный метод
- Макет выпускного класса
- Макет конструктора
- Макет статического метода
Я называю эти приемы необычным издевательством. Я был обеспокоен тем, что такие примеры без какого-либо руководства могут широко использоваться партнерами по команде, не имеющими большого опыта в насмешливых рамках.
Разработчики, практикующие TDD или BDD, должны знать о проблемах тестируемости этих конструкций и стараться избегать их при разработке своих тестов и модулей. По этой причине вы, вероятно, не будете часто сталкиваться с таким необычным издевательством над проектом с использованием этих замечательных методологий программирования.
Но иногда вам приходится расширять или поддерживать устаревшую кодовую базу, которая обычно содержит классы с низкой связностью . В большинстве случаев в современном беспокойном и неспокойном мире нет времени сделать такой класс простым для модульного тестирования стандартным способом. Когда вы пытаетесь провести юнит-тестирование такого класса, вы часто понимаете, что нужен необычный издевательство.
Вот почему я решил создать и поделиться соображениями рефакторинга наряду с примерами и обходными путями для необычного насмешки. Примерами являются использование Mockito и PowerMock mocking frameworks и среда тестирования модулей TestNG.
Ложный финальный метод
Рефакторинг соображения
Измените метод на non-final (удалите ключевое слово final) и протестируйте его стандартным способом. Эту технику я использую всегда, когда могу изменить код финального метода.
Использование PowerMock
Перед использованием этого примера, пожалуйста, внимательно подумайте, стоит ли рисковать манипулированием байт-кодом в вашем проекте. Они собраны в этом блоге . На мой взгляд, его следует использовать только в очень редких случаях, которых нельзя избежать.
Тест показывает, как смоделировать финальный метод с помощью платформы PowerMock. Пример охватывает:
- Насмешка над финальным методом с возвращаемым значением
- Насмешка над финальным пустым методом
- Проверка окончательных вызовов методов
Класс с финальными методами:
public class Bike { public final void shiftGear(boolean easier) { throw new UnsupportedOperationException("Fail if not mocked! [easier=" + easier + "]"); } public final int getGear() { throw new UnsupportedOperationException("Fail if not mocked!"); } }
Тестируемый класс:
public class Rider { private Bike bike; public Rider(Bike bike) { this.bike = bike; } public int prepareForUphill() { int gear = bike.getGear(); for (int idx = 0; idx < 2; idx++) { bike.shiftGear(true); gear++; } return gear; } }
Контрольная работа:
@PrepareForTest(Bike.class) public class RiderTest extends PowerMockTestCase { private static final int TESTING_INITIAL_GEAR = 2; @Test public void testShiftGear() { Bike mock = PowerMockito.mock(Bike.class); Rider rider = new Rider(mock); Mockito.when(mock.getGear()).thenReturn(TESTING_INITIAL_GEAR); // invoke testing method int actualGear = rider.prepareForUphill(); Assert.assertEquals(actualGear, TESTING_INITIAL_GEAR + 2); Mockito.verify(mock, Mockito.times(2)).shiftGear(true); } }
связи
Исходный код можно скачать с Github.
Другие необычные насмешливые примеры: