Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I import AndroidJUnit4 and ActivityTestRule into my unit test class?

I'm having trouble importing some of the Android UI testing framework classes - I just can't figure out what is going wrong!

This is my class:

@RunWith(AndroidJUnit4.class) @LargeTest public class ExampleUnitTest {  @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class);  @Test public void listGoesOverTheFold() {     onView(withText("Hello world!")).check(matches(isDisplayed()));   } } 

But for some reason I get the errors 'cannot find symbol ActivityTestRule' and 'cannot find symbol AndroidJUnit4'. I've tried to import them but they cannot be found.

The dependencies in build.gradle are set to:

compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' androidTestCompile 'com.android.support:support-annotations:23.4.0'  androidTestCompile 'com.android.support.test:runner:0.4' androidTestCompile 'com.android.support.test:rules:0.4' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 

So I think I have all the dependencies setup - I've been trying many things but with no luck.

Anyone have any ideas?

like image 557
Hallupa Avatar asked Jun 14 '16 20:06

Hallupa


People also ask

What is testInstrumentationRunner Androidx test runner AndroidJUnitRunner?

Earlier in the module's build.gradle file, we have a testInstrumentationRunner statement: testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" (from ToDoTests/build.gradle) This tells Android how to run our JUnit instrumented tests. JUnit uses “runner” classes for this role, and androidx.

What is rule in unit testing Android?

The rule launches the chosen activity before each test annotated with @Test , as well as before any method annotated with @Before . The rule terminates the activity after the test completes and all methods annotated with @After finish.

What is activity test rule?

public ActivityTestRule (Class<T> activityClass, boolean initialTouchMode) Similar to ActivityTestRule but defaults to launch the activity under test once per Test method. It is launched before the first Before method, and terminated after the last After method.


2 Answers

Add these in the newer version:

androidTestImplementation 'com.android.support.test:rules:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2' 
like image 63
Smaran Avatar answered Sep 18 '22 14:09

Smaran


There are two different types of tests you can set up in Android

Unit Tests

  • These run directly on the JVM and do not have access to the Android framework classes.
  • They are kept in the test/java package
  • Dependencies need to added in the build.gradle file with the command testCompile
  • You generally use Mockito, Robolectric & JUnit for these tests

Instrumentation Tests

  • These run on an Android emulator and have full access to all the Android classes
  • They are kept in the androidTest/java package
  • Dependencies need to be added to build.gradle with androidTestCompile
  • You generally use Espresso and JUnit for these tests

From what I can tell you are trying to write instrumentation tests with Espresso but have your test in the test/java package which is for unit tests. In that case you need to move your test class to the androidTest/java package.

like image 32
Jahnold Avatar answered Sep 17 '22 14:09

Jahnold