I want to use Dagger + Robolectric in src/test/java package. Is it possible? How?
Somebody wrote their Robolectric tests at src/androidTest/java package then used Dagger, But Robolectric is a framework that runs your tests inside the JVM on your workstation in seconds.
If I write my test in src/androidTest/java package it won't run inside the JVM.
Anyway, Is it right to use Dagger at src/test/java package? Is it possible?
Yes, it's perfectly possible to use dagger in robolectric tests. But in general
You don’t have to use Dagger for single-class unit tests
https://google.github.io/dagger/testing.html
Related
I'm trying to write some unit tests using spek framework, but keep running into RuntimeException (Method threw 'java.lang.RuntimeException exception. Stub!) when trying to access Looper (Looper.getMyLooper()) in code.
I'm using the TestScheduler provided by Rx as the Scheduler and tried #RunWith(AndroidJUnit4::class) as well as #RunWith(RobolectricTestRunner::class)
Any pointers?
Looper is Android dependency and you can't use it in unit tests.
https://developer.android.com/studio/test#test_types_and_location
These are tests that run on your machine's local Java Virtual Machine
(JVM). Use these tests to minimize execution time when your tests have
no Android framework dependencies or when you can mock the Android
framework dependencies.
Try to remove the explicit Looper dependency from the tested class and pass it from the outside (https://developer.android.com/training/dependency-injection) This is the best solution that leads to fast unit test and maintainable code.
Second option is rewrite you test to instrumented test and run it on Android emulator. This test will be slow.
Third option is setup Robolectric to mock Looper. Look at http://robolectric.org/javadoc/3.0/org/robolectric/shadows/ShadowLooper.html
I am trying to run a unit test like that:
#org.junit.jupiter.api.Test
void junit5codeCoverage() {
final int result = new Foo().junit5();
Assert.assertEquals(Looper.getMainLooper().getThread(), Thread.currentThread());
assertEquals(-1, result);
}
That is a Junit5 test with Android dependencies (i.e Looper.getMainLooper()) with Robolectric.
I am using the junit5 android plugin from mannodermaus that allows running junit5 within Android setups. But this does not work out of the box because it would not load robolectric. So I tried alixwar's branch that would tackle robolectric and junit5 test coverage, but still, would not use Android classes.
I furthermore started to investigate how to run a robolectric test on junit5, which would require understanding how the RobolectricTestRunner works and how to port the code to the JUnit5 platform. I have little understanding of the new junit5 platform, but I figured out that I could build on top of the org.junit.platform.runner.JUnitPlatform runner, to follow the test runner concept, which is part of the junit-platform-runner package. But this is so far away from the original Junit4 SandBoxTestRunner that I couldn't manage to complete the port.
So what would be the most feasible path to implement robolectric junit5 support, or is there any (obvious) concept I am missing?
I am trying to do this too, but it seems that at the time of this writing, Robolectric simply does not support junit5.
See the discussion here: https://github.com/robolectric/robolectric/issues/2996
Some workarounds are described in that discussion, but for now I am just going to stick to junit4.
You can use junit-vintage-engine to run test with runners from JUnit4.
Just add org.junit.vintage:junit-vintage-engine to your dependencies, thus you can org.junit.runner.RunWith annotation to your tests.
I am looking to introduce Cucumber tests into my Android application. In order to do that, I need a custom test instrumentation runner that makes use of CucumberInstrumentationCore as described here.
However I already have Espresso tests that are driven by JUnit, and I therefore already have a custom test instrumentation runner that uses AndroidJUnitTestRunner.
It seems to me that a custom implementation cannot use both simultaneously, because the onStart() methods of each call finish() on the tested activity.
It seems that my options are:
Copy the source code of both CucumberInstrumentationCore and AndroidJUnitTestRunner and produce a new, combined test runner that performs the necessary parts of both
Or...
Have the JUnit tests in the androidTest folder, and create a new instrumentation test folder alongside androidTest which contains only the Cucumber tests. Is this even possible?
How can I proceed, and have I missed a more elegant way of doing this?
I ended up producing a combined instrumentationTestRunner which seems to work OK:
https://gist.github.com/dhoskins/98afa6976c87cb20328d42065c7292ee
I want to use Junit & Mockito for android framework java files for local unit testing.
I am not using android studio and want to write these unit testcases and execute them on Linux server.
I have used libraries Junit, Mockito , hamcrest-core jar files. Do I need to include any other jar files?
I am stuck at mocking the context.
#Mock Context context - Doesn't work at all
Can anyone please guide me on this?
I want to run some JUnit4 tests. The code relies on some Android libraries(Android XML parser), but does not create any activites and so on. When I try to run tests I got that an Android class that I need was not found. Is there any way to run JUnit4 tests with Android code, not to test activity but to test code with some libraries.
I had the same problem and tried to adapt JUnit4 to Android's existing TestRunner - without success. Therefore I created a new project called JUnit4Android. It's a TestRunner application library for JUnit4 and JUnit3 tests and test suites. So you can run your existing JUnit4 tests with it. Please find more information on GitHub:
https://github.com/dthommes/JUnit4Android/wiki
There is no way (that I'm aware of) to use JUnit4 on Android. It does support JUnit3 though, if that's an option for you?
Alternatively, you could use Robolectric and run your tests on your development machine (where you'll be able to use whichever unit test framework you like). Whether this will work for you depends on exactly what you're testing, but it might be worth a go?
It might be little bit late, but there's finally an official update from Google about junit4:
based on Android-test-kit project and some other sources it's clear that:
The AndroidJUnitRunner is a new unbundled test runner for Android, which is part of the
Android Support Test Library and can be downloaded via the Android
Support Repository. The new runner contains all improvements of
GoogleInstrumentationTestRunner and adds more features:
- JUnit4 support
- Instrumentation Registry for accessing Instrumentation, Context and Bundle Arguments
- Test Filters #SdkSupress and #RequiresDevice
- Test timeouts
- Sharding of tests
- RunListener support to hook into the test run lifecycle
- Activity monitoring mechanism ActivityLifecycleMonitorRegistry
Actually, it's already presented in Support Repository. If You go to
%ANDROID_HOME%\extras\android\m2repository\com\android\support\test\testing-support-lib\
it's possible to find testing-support-lib in there (aar, jars etc.) which allows to use JUnit4. Even more, it contains espresso library same location which is handy for UI testing. Seems Android sites and support lib official references will be updated soon with that info.