class FractalTransformerGenerationTest: BaseAppModuleSystemTestCase() {
init {
addPackageDependency<FractalPackage>()
addDependency(EloquentModelsDependency())
}У меня сильно разрослись тесты и понадобились некоторые бест-практис, чтобы навести порядок. Тестам часто нужна какая-то инициализация. Она выполняется в setUp/tearDown. Если тестов с общей инициализацией много - то убирают дублирование путем выделения базового класса и вынесения этой инициализации туда.
До определенного момента я так и делал, а потом понял, что иногда нужны разные инициализации. Вот здесь мне нужно подключить определенный пакет(Fractal) и некоторые Eloquent модели к проекту. Плюс там BaseAppModuleSystemTestCase тоже не просто так стоит)
Пора применять композицию вместо наследования. Сделал простой интерфейс
interface TestDependency {
fun setUp(fixture: CodeInsightTestFixture)
fun tearDown(fixture: CodeInsightTestFixture) {}
}ну а в самом базовом тестовом классе:
private val dependencies = mutableListOf<TestDependency>()
fun addDependency(dependency: TestDependency) = dependencies.add(dependency)
override fun setUp() {
super.setUp()
...
dependencies.forEach { it.setUp(myFixture) }}
override fun tearDown() {
dependencies.forEach { it.tearDown(myFixture) }super.tearDown()
}Очень удобно стало. Намного меньше мусора теперь в тестах. По хорошему надо и этот BaseAppModuleSystemTestCase превратить в тестовую зависимость, но пока лень.