Android Studio单元测试:读取数据(输入)文件
在单元测试中,如何在不硬编码路径的情况下从(桌面)文件系统上的json文件读取数据 我希望从文件中读取测试输入(用于我的解析方法),而不是创建静态字符串Android Studio单元测试:读取数据(输入)文件,android,unit-testing,android-studio,Android,Unit Testing,Android Studio,在单元测试中,如何在不硬编码路径的情况下从(桌面)文件系统上的json文件读取数据 我希望从文件中读取测试输入(用于我的解析方法),而不是创建静态字符串 该文件与我的单元测试代码位于同一位置,但如果需要,我也可以将其放置在项目中的其他位置。我正在使用Android Studio。取决于Android gradle插件版本: 1。版本1.5及更高版本: 只需将json文件放到src/test/resources/test.json中,并将其引用为 classLoader.getResource("
该文件与我的单元测试代码位于同一位置,但如果需要,我也可以将其放置在项目中的其他位置。我正在使用Android Studio。取决于
Android gradle插件
版本:
1。版本1.5及更高版本:
只需将json文件放到src/test/resources/test.json中,并将其引用为
classLoader.getResource("test.json").
不需要对渐变进行修改
2。低于1.5的版本:(或者如果由于某种原因上述解决方案不起作用)
确保您至少正在使用。按照链接正确设置Android Studio
创建test
目录。将单元测试类放在java
目录中,并将资源文件放在res
目录中。Android Studio应将其标记如下:
创建gradle
任务,将资源复制到classes目录中,使它们对classloader
可见:
android{
...
}
task copyResDirectoryToClasses(type: Copy){
from "${projectDir}/src/test/res"
into "${buildDir}/intermediates/classes/test/debug/res"
}
assembleDebug.dependsOn(copyResDirectoryToClasses)
现在,您可以使用此方法获取文件资源的文件
引用:
private static File getFileFromPath(Object obj, String fileName) {
ClassLoader classLoader = obj.getClass().getClassLoader();
URL resource = classLoader.getResource(fileName);
return new File(resource.getPath());
}
@Test
public void fileObjectShouldNotBeNull() throws Exception {
File file = getFileFromPath(this, "res/test.json");
assertThat(file, notNullValue());
}
通过Ctrl+Shift+F10对整个类或specyfic测试方法运行单元测试
如果您转到Run->Edit configurations->JUnit,然后为单元测试选择运行配置,则会有一个“工作目录”设置。这应该指向json文件所在的位置。请记住,这可能会破坏其他测试。对于本地单元测试(与插装测试相比),您可以将文件放在src/test/resources
下,并使用classLoader读取它们。例如,下面的代码将在资源目录中打开myFile.txt
文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
它与
- Android Studio 1.5.1
- gradle插件1.3.1
我在Android Studio的测试资源方面遇到了很多问题,因此为了清晰起见,我设置了一些测试。在我的
mobile
(Android应用程序)项目I添加了以下文件:
mobile/src/test/java/test/ResourceTest.java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt
测试类别(所有测试均通过):
在同一个根项目中,我有一个名为data
的Java(不是Android)项目。如果向数据项目添加相同的文件:
data/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt
如果我从Android Studio执行上述所有测试,那么这些测试都将失败,但它们会在命令行中通过/gradlew data:test
。
为了绕过它,我使用了这个hack(在Groovy中)
用法:resource('/test.txt')
Android Studio 2.3,Gradle 3.3在我的例子中,解决方案是添加到Gradle文件中
sourceSets {
test.resources.srcDirs += 'src/unitTests/resources'
}
之后,AS 2.3.1找到了所有内容
javaClass.classLoader.getResourceAsStream("countries.txt")
我想我应该在这里补充我的发现。我知道这有点旧,但对于较新版本的Gradle,没有src/test/resources目录,整个项目只有一个resources目录,您必须将这一行添加到Gradle文件中
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
通过执行此操作,您可以通过以下方式访问您的资源:
this.getClass().getClassLoader().getResourceAsStream(fileName);
我一直在寻找这个问题,但找不到答案,所以我决定在这里帮助其他人。事实上,这就是仪器测试(运行Android Studio版本3.5.3,Android Gradle插件版本3.5.3,Gradle版本6.0.1)对我有效的原因:
将文件放入src/androidTest/assets
文件夹
在测试文件中:
InputStream is=InstrumentationRegistry.getInstrumentation().getContext().getAssets().open(“filename.txt”)代码>我尝试了几乎所有与IOUtils.toString(this.getClass().getResourceAsStream(“test_documents.json”),“UTF-8”)的组合,它总是返回null。可能是因为这些文件不会包含在jar中。我们讨论的是涉及android emulator/device的单元测试吗?@Android777我想我们讨论的是最新版本的android Studio@Frank中引入的新单元测试支持,您将测试文档.json
放在哪里?资产目录?是的,我们谈论的是新的单元测试支持,不涉及模拟器/设备。我没有把它放在assets目录中,因为这样它就和liveapk打包在一起了。我把它和测试(java)文件放在同一个文件夹中,然后使用这个.getClass().getResourceAsStream(test.json)?我在那里添加了文件,在项目的根目录中,它仍然找不到文件。这可以用于使用new File()
或类似方法加载文件,但不能直接使用上面描述的类路径加载方法。这也有点棘手,因为每个新的运行配置都需要设置工作目录,默认情况下AS和Gradle命令行喜欢使用不同的工作目录。。。真是太棒了!你的编辑,没有仪器测试,效果很好,谢谢!这是一个很好的解决方案,但并不总是有效。如果执行clean任务,然后运行testDebug,则会失败。基本上,开发人员需要知道他必须在testDebug之前运行assembleDebug任务。你们有什么改进的建议吗?使用AndroidStudio 1.5和android插件1.5.0,将json文件放在这里src/test/resources/test.json
并将其引用为classLoader.getResource(“test.json”)
。不需要对渐变进行修改。资源中的嵌套文件夹也在工作。答案不完整。什么是类加载器?这行代码放在哪里?您可以对返回的结果做什么?。请提供更完整的代码-1阅读Kotlin中的/src/test/resources/file.txt
:TestClassName::class.java.getResource(“/file.txt”)!!。readText()
这对我不起作用,请看我的问题,当我从“src/test/res”改为“src/test/resources”时,这对我起作用了。使用AndroidStudio 2.0RC3,gradle:2.0.0-RC3工作正常。但测试是得到的
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
this.getClass().getClassLoader().getResourceAsStream(fileName);