是否有可能找出一个Android应用程序是否作为仪器testing的一部分运行

是否有一个运行时检查应用程序,以确定它是否作为仪器testing的一部分运行?

背景:我们的应用程序在启动时执行数据库同步。 但是这只有在定期开始时才会发生。 它尤其会干扰testing数据库同步的仪器testing。 不出所料。

而所有其他的testing只是浪费CPU周期。

Solutions Collecting From Web of "是否有可能找出一个Android应用程序是否作为仪器testing的一部分运行"

如果你正在使用ActivityUnitTestCase,你可以用setApplication设置一个自定义的Application对象,并且在那里有一个标志来打开或closures数据库同步? 有一个在我的博客上使用自定义应用程序对象的例子:

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

从API级别11开始, ActivityManager.isRunningInTestHarness()方法可用。 这可能做你想要的。

一个更简单的解决scheme是检查只存在于testing类path中的类,与JUnit 4一起工作(与使用ActivityUnitTestCase的解决scheme不同),并且不需要将自定义意图发送到您的活动/服务(甚至可能不是在某些情况下可能)

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

您可以将意图额外传递给您的活动,表明它正在testing中。

1)在您的testing中,将“testMode”额外传递给您的活动:

 public void setUp() throws Exception { super.setUp(); Intent activityIntent = new Intent(); activityIntent.putExtra("testMode", true); setActivityIntent(activityIntent); } 

2)在你的活动中,检查testMode:

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

这为我工作,因为没有实际的设备正在运行

 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); }