아래와 같은 멀티모듈 구조를 가진 프로젝트에서 module-library
에 포함된 User
라는 클래스와 연관된 테스트를 각각의 모듈에서 작성한다고 할 때 어떤 문제점이 있을까요?
├── module-one
│ └── module-library
│ └── test
│ └── OneUserTest
├── module-two
│ └── module-library
│ └── test
│ └── TwoUserTest
├── module-three
│ └── module-library
│ └── test
│ └── ThreeUserTest
└── module-library
└── src
└── User
실제 코드를 작성할 때는 별 다른 문제가 없지만 테스트를 작성할 때 module-library
에서 가지고 있는 User
에 대한 Test Fixture를 중복적으로 각 모듈별로 만들어주어야 하는 별거 아니지만 귀찮은 문제가 있습니다.
각 모듈 module-one
, module-two
, module-three
테스트 패키지 하위에 필요한 Fixture를 만들어서 사용할 수 있기에 불편함을 감수하고 사용하고 있었는데
Gradle의 java-test-fixtures
plugin을 통해 모듈 별 Test Fixture 중복을 제거할 수 있었습니다.
Gradle java-test-fixtures 플러그인 적용하기
module-library/build.gradle.kts
plugins {
`java-test-fixtures`
}
플러그인 추가 후 여러 모듈에서 사용할 module-library/src/testFixtures
디렉토리를 생성하고 하위에 아래와 같이 Fixture 생성을 위한 클래스를 생성합니다.
module-library/src/testFixtures/kotlin/com.example/Fixtures.kt
object Fixtures {
fun user(cn: String): User =
User(
name = "김규남",
orga = "무슨 조직",
)
}
testFixtures 사용하기
module-library
에 정의된 testFixtures
를 사용하기 위해서는 Fixture의 적용이 필요한 모듈에 아래와 같이 의존성을 추가해야 합니다.
module-one/build.gradle.kts
dependencies {
implementation(project(":module-library"))
testImplementation(testFixtures(project(":module-library"))) // 추가
}
위와 같이 의존성을 추가하고 나면 OneUserTest에서 해당 Fixtures.user 메소드를 호출할 수 있습니다.
module-one/src/test/kotlin/com.example/OneUserTest.kt
class OneUserTest {
@Test
fun `test`() {
val user = Fixtures.user()
}
}
다른 모듈 module-two
, module-three
도 동일하게 사용할 수 있습니다.
이제는 각각의 모듈에서 Test Fixture를 위해 중복 코드를 정의하지 않고 module-library/testFixtures
하위에만 Fixture 정의를 위한 코드를 추가해 사용할 수 있습니다.