Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2022.05.12 일일 학습 기록 #2

Open
ChanJun-Park opened this issue May 12, 2022 · 0 comments
Open

2022.05.12 일일 학습 기록 #2

ChanJun-Park opened this issue May 12, 2022 · 0 comments

Comments

@ChanJun-Park
Copy link
Owner

Debug

안드로이드 클래스를 디버그하기 위해서는 실행환경의 안드로이드 버전과 compile 또는 target sdk 버전이 일치해야 한다.

androidTest, test 폴더간 코드 공유

sharedTest 공유 폴더 생성 및 java 소스 패키지 생서

스크린샷 2022-05-12 오전 8 38 28

build.gradle 에서 각 테스트 sourceSets 에 새로 추가된 공유 폴더 패키지 추가

스크린샷 2022-05-12 오전 8 38 44

테스트 코드에서 Dispatchers.Main 에러 처리

Main Dispatcher 는 Looper 를 필요로 하는데, jvm 환경에서는 지원되지 않는듯. 이를 해결하기 위해서 다음과 같이 rule 을 정의할 수 있다.

@ExperimentalCoroutinesApi
class MainCoroutineRule(
    private val dispatcher: CoroutineDispatcher = TestCoroutineDispatcher()
) : TestWatcher(), TestCoroutineScope by TestCoroutineScope(dispatcher) {

    override fun starting(description: Description?) {
        super.starting(description)
        Dispatchers.setMain(dispatcher)
    }

    override fun finished(description: Description?) {
        super.finished(description)
        Dispatchers.resetMain()
    }
}

그 다음 테스트 클래스에 다음과 같이 rule 을 적용하면 Dispatchers.Main 이 test dispatcher 로 변환되어 사용된다.

@ExperimentalCoroutinesApi
class ShoppingViewModelTest {

    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    @get:Rule
    var mainCoroutineRule = MainCoroutineRule()
    ...

}

Hilt 를 통해서 테스트 의존성 주입

다음 의존성 추가

// For Robolectric tests.
testImplementation("com.google.dagger:hilt-android-testing:2.38.1")
// ...with Kotlin.
kaptTest("com.google.dagger:hilt-android-compiler:2.38.1")

// For instrumented tests.
androidTestImplementation("com.google.dagger:hilt-android-testing:2.38.1")
// ...with Kotlin.
kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.38.1")

HiltTestApplication 을 사용하기 위해서 TestRunner 클래스 정의

class HiltTestRunner : AndroidJUnitRunner() {

    override fun newApplication(
        cl: ClassLoader?,
        className: String?,
        context: Context?
    ): Application {
        return super.newApplication(cl, HiltTestApplication::class.java.name, context)
    }
}

새로 정의한 HiltTestRunner 를 사용하도록 build.gradle 파일 수정

android {
    compileSdkVersion 30
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.androiddevs.shoppinglisttestingyt"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
				
				// 새로 추가한 TestRunner 설정
        testInstrumentationRunner "com.androiddevs.shoppinglisttestingyt.HiltTestRunner"
        buildConfigField("String", "API_KEY", API_KEY)
    }
    ...
}

테스트 패키지에 테스트용 모듈 클래스 정의

@Module
@InstallIn(SingletonComponent::class)
object TestAppModule {

    @Provides
    @Named("test_db")
    fun provideInMemoryDb(@ApplicationContext context: Context) =
        Room.inMemoryDatabaseBuilder(context, ShoppingItemDatabase::class.java)
            .allowMainThreadQueries()
            .build()
}

테스트 클래스에 다음과 같이 설정

@ExperimentalCoroutinesApi
@SmallTest
@HiltAndroidTest // 어노테이션 설정
class ShoppingDaoTest {

    @get:Rule
    var hiltRule = HiltAndroidRule(this) // hilt rule 추가
    
    @get:Rule
    val instantTaskExecutorRule = InstantTaskExecutorRule()

    @Inject
    @Named("test_db") // 주입할 의존성 어노테이션 추가
    lateinit var database: ShoppingItemDatabase
    private lateinit var shoppingDao: ShoppingDao

    @Before
    fun setup() {
        hiltRule.inject() // 의존성 주입 코드 추가
        shoppingDao = database.shoppingDao()
    }

    @After
    fun cleanUp() {
        database.close()
    }
...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant