Fra*_*ank 90 android unit-testing android-studio
在单元测试中,如何在我的(桌面)文件系统上读取json文件中的数据,而无需对路径进行硬编码?
我想从文件中读取测试输入(对于我的解析方法),而不是创建静态字符串.
该文件与我的单元测试代码位于同一位置,但如果需要,我也可以将其放在项目的其他位置.我正在使用Android Studio.
kli*_*mat 136
取决于android-gradle-plugin版本:
1. 1.5及更高版本:
只需将json文件放入src/test/resources/test.json并引用即可
classLoader.getResource("test.json").
Run Code Online (Sandbox Code Playgroud)
不需要进行gradle修改.
2.版本低于1.5 :(或由于某些原因上面的解决方案不起作用)
确保您至少使用Android Gradle Plugin 1.1版.点击链接正确设置Android Studio.
创建test目录.将单元测试类放在java目录中,并将资源文件放在res目录中.Android Studio应标记如下:

创建gradle任务以将资源复制到类目录中,使其可见classloader:
android{
...
}
task copyResDirectoryToClasses(type: Copy){
from "${projectDir}/src/test/res"
into "${buildDir}/intermediates/classes/test/debug/res"
}
assembleDebug.dependsOn(copyResDirectoryToClasses)
Run Code Online (Sandbox Code Playgroud)现在您可以使用此方法获取File文件资源的引用:
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());
}
Run Code Online (Sandbox Code Playgroud)use*_*045 69
对于本地单元测试(与测试测试相比),您可以将文件放在其下src/test/resources并使用classLoader读取它们.例如,以下代码myFile.txt在资源目录中打开文件.
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
Run Code Online (Sandbox Code Playgroud)
它合作
ar-*_*r-g 12
就我而言,解决方案是添加到gradle文件中
sourceSets {
test.resources.srcDirs += 'src/unitTests/resources'
}
Run Code Online (Sandbox Code Playgroud)
之后,AS 2.3.1发现了一切
javaClass.classLoader.getResourceAsStream("countries.txt")
Run Code Online (Sandbox Code Playgroud)
Rap*_*res 10
我想我应该在这里添加我的发现。我知道这有点旧,但是对于较新版本的 Gradle,其中没有 src/test/resources 目录,但整个项目只有一个资源目录,您必须将此行添加到您的 Gradle 文件中。
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,您可以通过以下方式访问您的资源:
this.getClass().getClassLoader().getResourceAsStream(fileName);
Run Code Online (Sandbox Code Playgroud)
我一直在寻找这个并找不到答案,所以我决定在这里帮助其他人。
我在Android Studio中遇到了很多测试资源问题,所以为了清晰起见,我设置了一些测试.在我的
mobile(Android应用程序)项目中,我添加了以下文件:
mobile/src/test/java/test/ResourceTest.java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt
Run Code Online (Sandbox Code Playgroud)
测试类(所有测试通过):
assertTrue(getClass().getResource("test.txt") == null);
assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
Run Code Online (Sandbox Code Playgroud)
在同一个根项目中,我有一个名为Java(不是Android)的项目data.如果我将相同的文件添加到数据项目:
data/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt
Run Code Online (Sandbox Code Playgroud)
如果我从Android Studio执行它们,那么上面的所有测试都将失败,但是它们会通过命令行传递./gradlew data:test.为了解决这个问题,我使用了这个hack(在Groovy中)
def resource(String path) {
getClass().getResource(path) ?:
// Hack to load test resources when executing tests from Android Studio
new File(getClass().getClassLoader().getResource('.').path
.replace('/build/classes/test/', "/build/resources/test$path"))
}
Run Code Online (Sandbox Code Playgroud)
用法: resource('/test.txt')
Android Studio 2.3,Gradle 3.3
就我而言,我只需要在文件夹resources中创建文件夹test并将我的资源文件放入该文件夹中。然后,在测试中只需将文件加载为资源流:
val inputStream =
this.javaClass.classLoader?.getResourceAsStream("gallery.xml")
Run Code Online (Sandbox Code Playgroud)
实际上,这就是对我有用的仪器测试(运行 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");
| 归档时间: |
|
| 查看次数: |
42133 次 |
| 最近记录: |