2

I am trying to build very simple unittest with roboletric but I can't create the activity.

I tried what was suggested on the thread but no success.

Resources$NotFoundException when calling Robolectric.buildActivity()

Yet, I am using the 4.0.1 version. I wonder if there some extra setup that I need to do.

Here's is my gradle:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'

    testImplementation 'androidx.test.espresso:espresso-core:3.1.0'
    testImplementation 'androidx.test:core:1.0.0'
    testImplementation 'androidx.test.ext:junit:1.0.0'
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.mockito:mockito-core:2.23.0'
    testImplementation 'org.robolectric:robolectric:4.0.1'
    androidTestImplementation 'com.google.truth:truth:0.42'
    testImplementation 'com.google.truth:truth:0.42'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
}

and my test program:

@Config(sdk = 28, manifest=Config.NONE)
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
    private Activity activity;
    @Before
    public void setup() {

        try {
            // I tried these 3 lines of code and they all throw the exception :(

            //activity = Robolectric.buildActivity(MainActivity.class).create().get();
            //activity = Robolectric.setupActivity(MainActivity.class);
            activity = Robolectric.buildActivity(MainActivity.class).create().start().resume().get();
        }
        catch (Exception e)
        {
            System.out.println("Keeps throwing exception!");
        }
    }
}

here' the output:

[Robolectric] com.guitarv.robotest.MainActivityTest.validateTextViewContent: sdk=28; resources=legacy
[Robolectric] NOTICE: legacy resources mode is deprecated; see http://robolectric.org/migrating/#migrating-to-40
Keeps throwing exception!
Test:Sun Nov 11 06:21:59 PST 2018

I did click on that link and update the gradle.properties to:

org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.enableUnitTestBinaryResources=true

But no success. I still can't create the activity and the legacy mode message keeps showing up.

any clues what am I doing wrong?

thank you.

gmmo
  • 2,577
  • 3
  • 30
  • 56
  • 1
    There is no need to use **@Config(sdk = 28)** as robolectric choose the SDK as the project default SDK which in your case i guess is 28 and . i faced a similar problem and solved by changing the test class SDK to 27 **@Config(sdk = 27)** – Omar Beshary Nov 12 '18 at 19:30
  • I tried, and no success. What a difficult thing to get a simple test program to work :( – gmmo Nov 12 '18 at 21:11
  • 1
    did you make sure of including android resources as mentioned in documentation ? testOptions { unitTests { includeAndroidResources = true } } – Omar Beshary Nov 12 '18 at 21:52
  • that was it! thx! – gmmo Nov 12 '18 at 22:38

2 Answers2

4

Robolectric can't find your app's resources.

Add this to your build.gradle:

android {
    testOptions {
        unitTests.includeAndroidResources = true
    }
}

Add this to your gradle.properties (not necessary with Android Studio 3.3+):

android.enableUnitTestBinaryResources=true
Xian
  • 934
  • 1
  • 7
  • 9
4

I was having this issue while using Robolectric 4.2. Upgrading to 4.2.1 fixed the problem.

amp
  • 11,754
  • 18
  • 77
  • 133