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
댓글남기기