Статьи

Окончательный метод

предисловие

Если вы уже читали какой-то другой пост в блоге о необычном насмешке, вы можете пропустить прелюдию по этой ссылке .

Меня попросили собрать воедино примеры, как макетировать Java-конструкции, хорошо известные по их проблемам с тестируемостью:

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

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

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

Вот почему я решил создать и поделиться соображениями рефакторинга наряду с примерами и обходными путями для  необычного насмешки. Примерами являются использование Mockito и PowerMock mocking frameworks и среда тестирования модулей TestNG.

Ложный финальный метод

Рефакторинг соображения

Измените метод на non-final (удалите ключевое слово final) и протестируйте его стандартным способом. Эту технику я использую всегда, когда могу изменить код финального метода.

Использование PowerMock

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

Тест показывает, как смоделировать финальный метод с помощью платформы PowerMock. Пример охватывает:

  1. Насмешка над финальным методом с возвращаемым значением
  2. Насмешка над финальным пустым методом
  3. Проверка окончательных вызовов методов

Класс с финальными методами:

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.

Другие необычные насмешливые примеры: