Представьте, что у вас есть приложение, и вы хотите выполнить над ним модульные и функциональные тесты (не сложно представить). У вас может быть абстрактный класс, назовем его AbstractTestClass, из которого распространяются все ваши модульные тесты.
AbstractTestClass будет выглядеть примерно так (с использованием JUnit 4):
class AbstractTestClass {
boolean setupDone = false;
@Before
public void before() {
if(!setupDone) {
// insert data in db
setupDone = true;
}
}
}
Вот с чем я борюсь. У меня есть другой абстрактный класс, который тестирует веб-интерфейсы:
class AbstractWebTestClass extends WebTestCase {
boolean setupDone = false;
@Before
public void before() {
if(!setupDone) {
// here, make a call to AbstractTestClass.before()
// init the interfaces
setupDone = true;
}
// do some more thing
}
}
Это почти тот же класс, за исключением того, что он расширяет WebTestCase . Этот дизайн может дать мне возможность иметь те же данные при модульном тестировании, что и при тестировании интерфейса.
Обычно, имея дело с такой проблемой, вы должны отдавать предпочтение композиции перед наследованием или использовать шаблон стратегии.
К сожалению, мне не совсем нравится идея отдавать предпочтение композиции перед наследованием в этом конкретном сценарии, и я не понимаю, как я мог бы использовать шаблон стратегии, возможно, есть недостаток дизайна, и я не совсем вижу решение.
Как я мог спроектировать эту архитектуру для достижения своей цели.