The Application
object for my Android app loads a JNI library, and Robolectric doesn\'t seem to like that. When I go to run my tests Robolectric craps out and I
As @Jared pointed out, the solution @Christopher gave doesn't work for Robolectric 2 or 3.
The solution I ended up using was to add the environmental variable:
ROBOLECTRIC=TRUE
to the build configuration for my tests. (Run -> Edit Configurations, Environmental Variables).
Then you check for that environmental variable before loading problematic libraries. For example:
class MyClass {
if(System.getenv("ROBOLECTRIC") == null) {
System.loadLibrary("libname");
}
}
Obviously you won't be able to test any code that relies on that library, but at least some testing will be possibel!
One option for apps with heavyweight Application classes that don't work well with Robolectric is to create an empty Application
object and use this for your Robolectric tests:
Something like this:
public void EmptyApp extends Application {
}
Then your test setup can look like this:
@RunWith(RobolectricTestRunner.class)
@Config(application = EmptyApplication.class, manifest = "src/main/AndroidManifest.xml", sdk = 23)
Since you have referenced the manifest, all of the resources will still be available in Context#getString(int id)
and so on.
Thanks to Jan Berkel for answering this here: https://groups.google.com/d/msg/robolectric/beW9XjT8E1A/pJQrRaybN30J
class MyJniClass {
static {
try {
System.loadLibrary("libname");
} catch (UnsatisfiedLinkError e) {
// only ignore exception in non-android env
if ("Dalvik".equals(System.getProperty("java.vm.name"))) throw e;
}
}
}
then in the testrunner:
public class MyTestRunner extends RobolectricTestRunner {
public MyTestRunner(Class testClass) throws InitializationError {
// remove native calls + replace with shadows
addClassOrPackageToInstrument("com.example.jni.MyJniClass");
}
protected void bindShadowClasses() {
// bind shadow JNI classes
}
}