предисловие
Если вы уже читали какой-то другой пост в блоге о необычном насмешке, вы можете пропустить прелюдию по этой ссылке .
Меня попросили собрать воедино примеры, как макетировать 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.
Другие необычные насмешливые примеры: