Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Type Android Junit4 not present exception

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.

like image 685
firedrillsergeant Avatar asked Aug 14 '18 00:08

firedrillsergeant


People also ask

How can I test an exception In JUnit?

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.

What is typenotpresentexception in Java?

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.

When to use try/catch In JUnit?

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:

How do you handle expected exceptions in tests?

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.


2 Answers

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

like image 114
Bohsen Avatar answered Sep 23 '22 12:09

Bohsen


Writing steps if someone facing issue while edit configuration for above @Bohsen's answer

  1. In Android Studio, click Run > Edit Configurations (or press alt + shift + f10 if on Windows) to open the configuration editor.
  2. The left panel of the window shows configurations and their groups.
    • Android JUnit group
    • Android instrumented tests

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.

like image 27
Tarun Avatar answered Sep 19 '22 12:09

Tarun