如何判断我的Android应用程序是否由InstrumentationTestRunner运行?

如何判断我的Android应用程序是否由InstrumentationTestRunner运行?,android,android-testing,Android,Android Testing,在我的应用程序(一个基于gradle的Android Studio项目)中,我需要在测试下运行时创建一个不同名称的文件。例如,在生产中,我希望使用com.myapp.file名称,在测试下运行时,使用com.myapp.file。测试 我想做的是: String packageName=getApplicationContext().getPackageName(); MyFile文件=新的MyFile(packageName) 我希望packageName在测试(./gradlew conne

在我的应用程序(一个基于gradle的Android Studio项目)中,我需要在测试下运行时创建一个不同名称的文件。例如,在生产中,我希望使用com.myapp.file名称,在测试下运行时,使用com.myapp.file。测试

我想做的是:

String packageName=getApplicationContext().getPackageName();
MyFile文件=新的MyFile(packageName)

我希望packageName在测试(./gradlew connectedInstrumentTest)下运行时与正常运行时会自动不同。我检查了我的清单,它显示我的测试清单有一个以.test结尾的包名,但它在运行时似乎没有将其传递给应用程序

有没有办法:

1) 更新我的gradle或project文件,以便在运行测试时使用不同的包名

-或-


2) 有没有一种方法可以通过编程来判断我的应用程序是否正在测试中运行?

事实上,由于Android基本上使用JUnit测试运行者,我想我可以有把握地说,Android并没有给你一种方法来确定你正在测试模式下运行。我会按照这篇文章的建议来回答:


我完全同意以不同的方式运行是不好的做法,但如果您只是想在测试时保存到不同的文件,这似乎并不太不公平。我会使用共享首选项,或者在应用程序类中设置一个全局变量来检查您是否正在测试中运行。由于通常在生产代码中引用测试是一个不好的主意,因此我认为在某个地方定义文件名并在setup和teardown中更改它是正确的方法。

因此,在测试运行程序中,您可以运行setup和teardown方法。为什么不在这些方法中建立文件名,并且在使用文件名的地方,接受它作为参数,而不是从包名推断它?是的,这是有效的。这就是我目前采用的解决方案。我发布这个问题是为了找到一个替代方案。我想要一个替代方法的原因是,我必须修改类的公共构造函数以接受文件名,我不希望这样做。如果有意义的话,我想隐藏这个实现细节。我能理解。不幸的是,我不认为有办法告诉你你正在运行一个测试,但我不是100%的,所以,因为这是一个问题,我不会作出回答。但是,我会考虑从共享偏好文件中获取文件名,并在测试设置中的文件中设置名称。不要接受它作为参数,而是从首选项中提取名称。只需确保在拆卸时重新更改名称即可