Espresso 3.4.0 버전 Serviceloaderwrapper 오류 해결하기

발생한 에러

Espresso로 UI 테스트 로직을 작성하고 Run을 시키니 메소드를 찾을 수 없다는 아래와 같은 오류와 함께 테스팅이 실패하는 문제를 겪었다.

java.lang.NoSuchMethodError: No static method loadSingleServiceOrNull(Ljava/lang/Class;)Ljava/lang/Object; in class Landroidx/test/internal/platform/ServiceLoaderWrapper; or its super classes (declaration of 'androidx.test.internal.platform.ServiceLoaderWrapper' appears in /data/app/com.example.tddexample-BVw9GRDErEML-XO22ks2ew==/base.apk)

기존 app의 build.gradle는 아래와 같다.

dependencies {
    androidTestImplementation 'androidx.test:runner:1.4.0'
    androidTestImplementation 'androidx.test:rules:1.4.0'

    // Unit Test
    // Required -- JUnit 4 framework
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    // Optional -- Mockito framework
    testImplementation 'org.mockito:mockito-core:3.11.2'
    testImplementation 'org.mockito:mockito-inline:2.13.0'


    // Integration Test
    // Required -- Robolectric
    testImplementation "org.robolectric:robolectric:4.6.1"
    // Required -- Robolectric environment
    testImplementation 'androidx.test:core:1.4.0'
    // Optional -- Testing Fragment
    debugImplementation "androidx.fragment:fragment-testing:1.3.6"

    // UI Test
    // Required -- Espresso
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

발생 원인

앱에서 여러 개의 ServiceLoaderWrapper을 가지고 있을 때, 발생할 수 있다고 한다.

테스팅에 사용했던 코드는 아래와 같다.

Test Code

@RunWith(AndroidJUnit4::class)
class MainFragmentTest {
    @get:Rule
    val activityRule = ActivityScenarioRule(MainActivity::class.java)
    
	@Test
    fun plusTest() {
        Espresso.onView(withId(R.id.et_first)).perform(typeText("100"))
        Espresso.onView(withId(R.id.et_second)).perform(typeText("150"))
        Espresso.onView(withId(R.id.btn_plus)).perform(click())
        Espresso.onView(withId(R.id.tv_result)).check(matches(ViewMatchers.withText("Result = 250")))
    }

해결 방법

1. Espresso 버전 다운그레이드

나는 Espresso 3.4.0 버전에서 위와 같은 문제를 겪었다.

이 버전을 3.3.0으로 낮춰주어도 잘 동작하였다.

2. 패키지 버전 강제 적용

android {
    configurations.all {
        resolutionStrategy {
            force 'androidx.test:monitor:1.4.0'
        }
    }
}

ServiceLoaderWrapper는 android.test:monitor에서 가져 온 클래스라고 한다.

해당 패키지 버전을 위와 같이 App의 build.gradle에 강제 적용하는 것으로도 해결 할 수 있다.

참고

https://stackoverflow.com/questions/67358179/android-espresso-test-error-no-static-method-loadsingleserviceornull

댓글남기기