如何确定Android应用程序是否使用JUnittesting工具启动?

我需要在运行时从代码确定应用程序是否在TestInstrumentation下运行。

我可以使用一些env / systemvariables初始化testing环境,但是Eclipse ADK启动configuration不允许我这样做。

默认的Android系统属性和环境不要有任何关于它的数据。 而且,它们是相同的,无论是定期开始还是正在testing。

这可能是一个解决scheme: 是否有可能找出一个Android应用程序作为仪器testing的一部分运行,但由于我不testing活动,所有提出的方法将无法正常工作。 ActivityManager.isRunningInTestHarness()方法在下面使用它:

SystemProperties.getBoolean("ro.test_harness") 

在我的情况下总是返回false。 (要使用隐藏的android.os.SystemProperties类我使用reflection)。

我还有什么可以尝试从应用程序内部确定是否正在testing?

Solutions Collecting From Web of "如何确定Android应用程序是否使用JUnittesting工具启动?"

我发现了一个很好的解决scheme:在应用程序之外,可以尝试从testing包中加载一个类。 令人惊讶的是,appication类加载器可以从testing项目中按名称加载类,如果它在testing中运行的话。 在其他情况下,类没有find。

 private static boolean isTestMode() { boolean result; try { application.getClassLoader().loadClass("foo.bar.test.SomeTest"); // alternatively (see the comment below): // Class.forName("foo.bar.test.SomeTest"); result = true; } catch (final Exception e) { result = false; } return result; } 

我承认这不是优雅,但它的作品。 将不胜感激的妥善解决scheme。

isTestMode()解决scheme在Android Studio 1.2.1.1上不适用于我。 我们公司的全能Krzysztof调整你的方法,使用:

 Class.forName("foo.bar.test.SomeTest"); 

而不是getClassLoader()。 感谢Krzysztof!

我们创build了一个将parameter passing给MainActivity的解决scheme,并在onCreate方法中使用它,使您能够定义如何创buildActivity。

MainActivity类中,我们创build了一些常量,这也可以是一个枚举。 我们也创build了一个静态属性。

 public class MainActivity { public static final int APPLICATION_MODE = 5; public static final int UNIT_TEST_MODE = 10; public static final int OTHER_MODE = 15; public static int activityMode = APPLICATION_MODE; (...) @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); switch (activityMode) { case OTHER_MODE: (...) break; case UNIT_TEST_MODE: Log.d(TAG, "Is in Test Mode!"); break; case APPLICATION_MODE: (...) break; } (...) } (...) } 

我们做了MainActivityTest类的抽象,创build了一个setApplicationMode并在调用super.setUp()方法之前在setUp()方法内部调用了这个方法。

 public abstract class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { protected void setUp() throws Exception { setApplicationMode(); // <===== super.setUp(); getActivity(); (...) } (...) public void setApplicationMode() { MainActivity.activityMode = MainActivity.UNIT_TEST_MODE; } } 

所有其他testing类都从MainActivityTestinheritance,如果我们希望它有另一个行为,我们可以简单地覆盖setApplicationMode方法。

 public class OtherMainActivityTest extends MainActivityTest { (...) @Override public void setApplicationMode() { MainActivity.activityMode = MainActivity.OTHER_MODE; } } 

用户nathan-almeida是这个解决scheme的共同作者的朋友。