访问测试工具资源

22

我正在尝试找到一种方法,使我的仪器测试可以访问在测试包内生成的字符串资源。

更多细节:

我有一个 Android 测试用例,继承自 ActivityInstrumentationTestCase2。我使用 Eclipse 的 Android 测试项目创建了测试。该测试项目具有资源(类似于常规 Android 项目的资源)。我正试图找到一种在各个单独测试中以编程方式访问测试项目中字符串资源的方法。我已尝试:

String s = getInstrumentation().getContext().getString(R.string.blah);
并且
String s = mActivity.getApplicationContext().getString(R.string.blah);

这两种方法都会抛出NotFoundException异常。我在strings.xml中定义了字符串"blah"。上面代码中的R是从我的测试包中导入的,而不是被测试应用程序的包。我能够使用后一种调用访问在应用程序包中定义的资源。

找到一种方法来在我的测试中访问XML定义的字符串资源将会很有用(因为我想避免将字符串键入代码中)。我做错了什么?

4个回答

28

即使这篇帖子不再是最新的,这个补充也可能对某些人有所帮助:

要理解这是如何工作的,你必须记住你的仪器化所处的上下文是另一个与你运行测试的应用程序上下文不同。正如你正确指出的那样,你无法从仪器化上下文中访问目标资源。你可以在测试项目内部的一个单独的xml文件中为您的仪器化上下文定义一些内容,或者 - 如果您想使用预定义的资源 - 您可以通过以下方式获得它们:

 Resources res = getInstrumentation().getTargetContext().getResources();
 res.getString(R.string.xxx); // get a string resource

在测试用例构造完全完成之前,既无法使用工具上下文(如Wujun所述),也无法使用目标上下文。


6
“getTargetContext()”代替“getContext()”就行了 :-) (也许发布者可以将答案标记为“接受回答”?) - Christine
在(支持)测试运行器的版本0.5中,getInstrumentation()方法已被移除。请改用InstrumentationRegistry.getTargetContext()方法获取上下文。 - Javad

3
我尝试过:
String s = getInstrumentation().getContext().getString(com.myProject.test.R.string.blah);

com.myProject是待测试项目的包名,com.myProject.test是测试项目的包名。

如果我把代码放在setup()里面,它对我有用。如果我把它放在构造函数里面,它就不起作用了。


1

我认为这是不可能的,除非将资源文件存储在其他地方,但您可以使用类似Robotium的东西,只需使用Solo.getString()即可获取您的资源。


0

对于使用 Kotlin 的 Androidx Compose,这是我所使用的:

val composeTestRule = createAndroidComposeRule<ComponentActivity>()
val helloWorld = composeTestRule.activity.getString(R.string.hello_world)
println(helloWorld) // hello world

PS: 我在跟随这个Android测试教程时发现了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接