Is it possible to find out if an Android application runs as part of an instrumentation test

ε祈祈猫儿з 提交于 2019-12-18 21:05:03

问题


Is there a runtime check for an application to find out if it runs as part of an instrumentation test?

Background: Our application performs a database sync when starting. But that should happen only when started regularly. It especially interferes with the instrumentation tests testing the db sync. Not surprisingly.

And with all the other tests it's just a waste of CPU cycles.


回答1:


If you're using ActivityUnitTestCase, you could set a custom Application object with setApplication, and have a flag in there to switch database sync on or off? There's an example of using a custom Application object on my blog:

http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-3/




回答2:


Since API Level 11, the ActivityManager.isRunningInTestHarness() method is available. This might do what you want.




回答3:


A much simpler solution is check for a class that would only be present in a test classpath, works with JUnit 4 (unlike the solution using ActivityUnitTestCase) and doesn't require to send custom intents to your Activities / Services (which might not even be possible in some cases)

private boolean isTesting() {
    try {
        Class.forName("com.company.SomeTestClass");
        return true;
    } catch (ClassNotFoundException e) {
        return false;
    }
}



回答4:


If you are using Robolectric, you can do something like this:

public boolean isUnitTest() {
        String device = Build.DEVICE;
        String product = Build.PRODUCT;
        if (device == null) {
            device = "";
        }

        if (product == null) {
            product = "";
        }
        return device.equals("robolectric") && product.equals("robolectric");
    }



回答5:


You can pass an intent extra to your activity indicating it's under test.

1) In your test, pass "testMode" extra to your activity:

public void setUp() throws Exception {
    super.setUp();

    Intent activityIntent = new Intent();
    activityIntent.putExtra("testMode", true);
    setActivityIntent(activityIntent);
}

2) In your activity, check for testMode:

Bundle extras = getIntent().getExtras();
if (extras != null && extras.getBoolean("testMode")) {
    // disable your database sync
}



回答6:


This work for me because no actual device is running

public static boolean isUnitTest() {
    return Build.BRAND.startsWith(Build.UNKNOWN) && Build.DEVICE.startsWith(Build.UNKNOWN) && Build.DEVICE.startsWith(Build.UNKNOWN) && Build.PRODUCT.startsWith(Build.UNKNOWN);
}



回答7:


You can try this

if (isRunningTest == null) {
        isRunningTest = false;
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        List<StackTraceElement> list = Arrays.asList(stackTrace);
        for (StackTraceElement element : list) {
            if (element.getClassName().startsWith("androidx.test.runner.MonitoringInstrumentation")) {
                isRunningTest = true;
                break;
            }
        }
    }


来源:https://stackoverflow.com/questions/6776689/is-it-possible-to-find-out-if-an-android-application-runs-as-part-of-an-instrume

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!