Reputation: 11632
I faced with the following problem:
When i trying to start a stand-alone UI test using Espresso i always get the following console error message without the running the test.
Test running startedTest running failed: Instrumentation run failed due to 'java.lang.IllegalAccessError'
Empty test suite.
So i tried to run command:
gradle -q dependencies
And i obtained the following result:
androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.android.support:support-annotations:23.0.1
+--- com.android.support.test:runner:0.3
| +--- com.android.support.test:exposed-instrumentation-api-publish:0.3
| +--- junit:junit:4.12
| | \--- org.hamcrest:hamcrest-core:1.3
| \--- com.android.support:support-annotations:22.2.0 -> 23.0.1
+--- com.android.support.test:rules:0.3
| \--- com.android.support.test:runner:0.3 (*)
+--- com.android.support.test.espresso:espresso-core:2.1 -> 2.2
| +--- com.android.support.test.espresso:espresso-idling-resource:2.2
| +--- com.squareup:javawriter:2.1.1
| +--- javax.inject:javax.inject:1
| +--- org.hamcrest:hamcrest-library:1.3
| | \--- org.hamcrest:hamcrest-core:1.3
| +--- com.android.support.test:rules:0.3 (*)
| +--- org.hamcrest:hamcrest-integration:1.3
| | \--- org.hamcrest:hamcrest-library:1.3 (*)
| +--- com.google.code.findbugs:jsr305:2.0.1
| +--- javax.annotation:javax.annotation-api:1.2
| \--- com.android.support.test:runner:0.3 (*)
+--- com.android.support.test.espresso:espresso-intents:2.2
| \--- com.android.support.test.espresso:espresso-core:2.2 (*)
+--- com.android.support.test.espresso:espresso-web:2.2
| +--- org.ccil.cowan.tagsoup:tagsoup:1.2
| +--- com.android.support:support-annotations:22.2.0 -> 23.0.1
| \--- com.android.support.test.espresso:espresso-core:2.2 (*)
+--- com.android.support.test.uiautomator:uiautomator-v18:2.1.1
+--- com.android.support.test.espresso:espresso-contrib:2.2
| +--- com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0
| | \--- org.hamcrest:hamcrest-core:1.3
| +--- com.android.support:support-v4:22.2.0
| | \--- com.android.support:support-annotations:22.2.0 -> 23.0.1
| +--- com.android.support:recyclerview-v7:22.2.0
| | +--- com.android.support:support-annotations:22.2.0 -> 23.0.1
| | \--- com.android.support:support-v4:22.2.0 (*)
| \--- com.android.support.test.espresso:espresso-core:2.2 (*)
\--- com.android.support:multidex-instrumentation:1.0.1
I tried find the some solution on this topic, but without the luck.
I don't know what exactly I should to update to make test working.
Here is the app.gradle config file
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "test.my.app"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// Enabling multidex support.
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'LICENSE.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
repositories {
jcenter()
mavenCentral()
maven { url "https://repo.commonsware.com.s3.amazonaws.com" }
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://jitpack.io" }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.google.android.gms:play-services:7.8.0'
compile 'com.mcxiaoke.volley:library:1.0.18'
compile 'com.orhanobut:logger:1.11'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.android.support:design:23.0.1'
// UI TESTING DEPENDENCIES
androidTestCompile 'com.android.support:support-annotations:23.0.1'
androidTestCompile 'com.android.support.test:runner:0.3'
androidTestCompile 'com.android.support.test:rules:0.3'
//androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2'
androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2'
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2'
androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
exclude group: 'com.android.support', module: 'multidex'
}
// ORM DATABASE DEPENDENCIES
compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
// STETHO CORE
compile 'com.facebook.stetho:stetho:1.1.1'
compile 'com.facebook.stetho:stetho-urlconnection:1.1.1'
compile 'com.facebook.stetho:stetho-okhttp:1.1.1'
// GOOGLE ANALYTICS
compile 'com.google.android.gms:play-services-analytics:7.8.0'
// JODA TIME FOR ANDROID
compile 'net.danlew:android.joda:2.8.2'
// SECURE SHARED PREFERENCES
compile 'com.scottyab:secure-preferences-lib:0.1.3'
// MATERIAL DIALOG
compile 'com.avast:android-styled-dialogs:2.2.0'
// SQL CIPHER
compile 'com.commonsware.cwac:sqlcipher-for-android:3.3.1'
// HTML PARSER
compile 'org.jsoup:jsoup:1.8.3'
// MULTIDEX SUPPORT
compile 'com.android.support:multidex:1.0.1'
// SECOND MATERIAL DIALOG
compile('com.afollestad.material-dialogs:core:0.8.1.0@aar') {
transitive = true
}
compile('com.afollestad.material-dialogs:commons:0.8.0.1@aar') {
transitive = true
}
// ANDROID BOOTSTRAP
compile 'com.beardedhen:androidbootstrap:2.0.0'
}
And Sample of TEST class:
@RunWith(AndroidJUnit4.class)
public class SignInActivityTest extends ActivityInstrumentationTestCase2<SignInActivity> {
public TestHelper tl = new TestHelper();
public SignInActivityTest() {
super(SignInActivity.class);
}
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
SignInActivity lActivity = getActivity();
}
// Insert scenario methods here
@Test
public void processTest() throws InterruptedException {
// TODO: strings which are inserted into inputs should be defined as the string constants
// Discuss it with Jan Sedlacek.
tl.insertTextIntoInput(R.id.login_txv_username, "test");
tl.insertTextIntoInput(R.id.login_txv_password, "test");
}
}
What should i to change to make this working please? I will glad for any help.
Upvotes: 8
Views: 5322
Reputation: 17536
I ran into a very similar problem.
Mine was caused by an uncaught InterruptedException
in some worker thread which stopped the testing process. The stacktrace shows up in the Android Monitor
...I was able to solve my problem by catching the exception.
Upvotes: 0
Reputation: 1
This means that you have problem in Gradle file. You use wrong dependencies.
I use robotium and JUnit 4 my dependebcies:
dependencies {
androidTestCompile fileTree(dir: 'libs', include: 'robotium-solo-5.5.4.jar')
androidTestCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.4'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4'
}
Upvotes: -1
Reputation: 529
This is a Gradle bug with MultiDex, as discussed in Android issue 194609:
[email protected]:
... it seems that the dependency 'multidex' is added to the app itself and the androidTestCompile apk :(...
Found a workaround, add this to your build.gradle file:
// Workaround for Multidex bug in gradle-android-plugin
// Replace Multidex dependency with some dummy dependency to avoid dex problems
// @see https://code.google.com/p/android/issues/detail?id=194609
project.getConfigurations().all { config ->
if (config.name.contains("AndroidTest")) {
config.resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.name == "multidex") {
details.useTarget("de.felixschulze.teamcity:teamcity-status-message-helper:1.2")
}
}
}
}
And, do not use MultiDexTestRunner.
Upvotes: 1
Reputation: 6910
ActivityInstrumentationTestCase2
is deprecated you have to use ActivityTestRule
instead:
@RunWith(AndroidJUnit4.class)
public class SignInActivityTest {
@Rule
public ActivityTestRule<SignInActivity> mActivityRule = new ActivityTestRule(SignInActivity.class);
public TestHelper tl = new TestHelper();
@Before
public void setUp() throws Exception {
//currently you don't use Activity instance in your tests
//I just put it here as an example how to get the activity from ActivityTestRule
SignInActivity lActivity = mActivityRule.getActivity();
}
// Insert scenario methods here
@Test
public void processTest() throws InterruptedException {
tl.insertTextIntoInput(R.id.login_txv_username, "test");
tl.insertTextIntoInput(R.id.login_txv_password, "test");
}
@After
public void tearDown() throws Exception {
//do some stuff if needed
}
}
Upvotes: 1