I have an Android project that I am trying to run Instrumentation tests for using AndroidStudio, but when I try to run the whole class file for the tests, I get the exceptions as stated below :
java.lang.TypeNotPresentException: Type android.support.test.runner.AndroidJUnit4 not present Caused by: java.lang.ClassNotFoundException: android.support.test.runner.AndroidJUnit4
Interestingly, I can run individual methods in this Instrument Test class, just not the whole class. My build.gradle file for the app is below:
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { lintOptions { abortOnError false } compileSdkVersion 28 defaultConfig { applicationId "com.sarpuner.journal" minSdkVersion 19 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } buildToolsVersion '27.0.3' } repositories { maven { url "https://dl.bintray.com/ijabz/maven" } } dependencies { androidTestImplementation 'com.android.support:support-annotations:27.1.1' implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0-rc01' implementation 'com.android.support.constraint:constraint-layout:1.1.2' implementation 'dev.dworks.libs:volleyplus:0.1.4' implementation 'com.google.code.gson:gson:2.8.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:rules:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'org.jsoup:jsoup:1.11.3' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.1' implementation 'net.jthink:jaudiotagger:2.2.3' api 'com.google.guava:guava:26.0-android' }
And the InstrumentTest class is as follows:
package com.sarpuner.journal import android.support.test.InstrumentationRegistry import android.support.test.runner.AndroidJUnit4 import android.util.Log import org.junit.Test import org.junit.runner.RunWith import org.junit.Assert.* import java.io.File private const val INSTRUMENT_TAG = "InstrumentTest" // TODO: There is a problem here with the class run! @RunWith(AndroidJUnit4::class) class ExampleInstrumentedTest { private val appContext = InstrumentationRegistry.getTargetContext() @Test fun useAppContext() { // Context of the app under test. assertEquals("com.sarpuner.journal", appContext.packageName) } @Test fun downloadAndSaveAudio() { val url = "http://telechargement.rfi.fr/rfi/francais/audio/jff/201808/journal_francais_facile_20h00_-_20h10_tu_20180809.mp3" val name = "09-08-2018.mp3" val f = File(appContext.filesDir, name) Log.d(INSTRUMENT_TAG, f.absolutePath) downloadAudio(url, f) } @Test fun downloadAndSaveTranscript() { val url = "https://savoirs.rfi.fr/fr/apprendre-enseigner/langue-francaise/journal-en-francais-facile-09082018-20h00-gmt" val name = "09-08-2018.txt" val f = File(appContext.filesDir, name) downloadText(url, f) } @Test fun addLyricsToAudio() { } }
Any help/guidance is much appreciated, thank you.
The above approach is useful for simple cases, but it has its limits. For example, you can't test the value of the message in the exception, or the state of a domain object after the exception has been thrown. To address this you can use the try/catch idiom which prevailed in JUnit 3.x: Alternatively, use the ExpectedException rule.
The TypeNotPresentException is a runtime exception in Java that is thrown when an application attempts to access a type using a string that represents the name of the type, but the definition for the type with the specified name cannot be found.
The above approach is useful for simple cases, but it has its limits. For example, you can't test the value of the message in the exception, or the state of a domain object after the exception has been thrown. To address this you can use the try/catch idiom which prevailed in JUnit 3.x:
Alternatively, use the ExpectedException rule. This rule lets you indicate not only what exception you are expecting, but also the exception message you are expecting: The expectMessage also lets you use Matchers, which gives you a bit more flexibility in your tests.
This is caused by Android Studio trying to execute an instrumentation test as a JUnit test.
I had to go to 'Edit Configurations...' and delete the configuration from Android JUnit group and manually add to the 'Android Instrumented Tests' group. After this I had no problem executing the tests.
In Android Studio, click Run > Edit Configurations
.
https://developer.android.com/studio/run/rundebugconfig
Writing steps if someone facing issue while edit configuration for above @Bohsen's answer
Run > Edit Configurations
(or press alt + shift + f10
if on Windows) to open the configuration editor.If your test is an instrumentation test, delete it from any JUnit tests groups.
If your test is a JUnit test, delete it from any instrumentation test groups.
For example, my test (DBTest.kt) was appearing in both Android JUnit and Instrumented group's section. So I deleted from JUnit group and ran it again, it was working fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With