android - 在UI测试期间启动后,应用程序关闭

标签 android gradle junit4 android-espresso

我正在尝试使用espresso在android应用程序上运行UI测试,但是当我在移动设备或模拟器上运行该测试时,该应用程序会打开,并且突然关闭,即使在运行测试之前,它也会快速关闭。

并不是说应用程序崩溃了,它只是在运行测试后才关闭。我不确定引发此行为的测试配置中缺少什么。

这是我的gradle文件

apply plugin: 'com.android.application'
apply plugin: 'realm-android'

android {
compileSdkVersion 25
buildToolsVersion '25.0.3'

defaultConfig {
    applicationId "com.test1"
    minSdkVersion 14
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'jp.wasabeef:picasso-transformations:2.1.2'
compile 'com.google.firebase:firebase-database:9.4.0'
compile 'com.google.firebase:firebase-auth:9.4.0'
compile 'com.google.firebase:firebase-messaging:9.4.0'
compile 'com.google.android.gms:play-services-location:9.4.0'
compile 'com.google.android.gms:play-services-places:9.4.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
androidTestCompile ('com.android.support.test:runner:1.0.1') {
    exclude module: 'support-annotations'
}
androidTestCompile ('com.android.support.test:rules:1.0.1') {
    exclude module: 'support-annotations'
}
androidTestCompile ('com.android.support.test.espresso:espresso-intents:3.0.1') {
    exclude module: 'support-annotations'
}
androidTestCompile ('com.android.support.test.espresso:espresso-web:3.0.1') {
    exclude module: 'support-annotations'
}
androidTestCompile ('com.android.support.test.espresso:espresso-core:3.0.1') {
    exclude module: 'support-annotations'
}
}

apply plugin: 'com.google.gms.google-services'

这是我的考验
@RunWith(AndroidJUnit4.class)
public class PAC4Testing {


@Rule
public ActivityTestRule<BookListActivity> mActivityRule = new ActivityTestRule<>(
        BookListActivity.class);


@Test
public void checkLoadedList() {
   if (getRVcount() > 0){
        assertEquals(9,getRVcount());
    }
}

private int getRVcount(){
    RecyclerView recyclerView = (RecyclerView) mActivityRule.getActivity().findViewById(R.id.book_list);
    return recyclerView.getAdapter().getItemCount();
}

@Test
public void checkMenuOpened() {

}

@Test
public void checkLoadedWebViewFromDetail() {

}
}

谢谢!

编辑这些是日志,运行测试时会出错,因为应用程序已关闭,测试无法在屏幕上找到任何内容。
java.lang.NullPointerException: Attempt to invoke virtual method 'int 

android.support.v7.widget.RecyclerView$Adapter.getItemCount()' on a null object reference
at PAC4Testing.getRVcount(PAC4Testing.java:34)
at PAC4Testing.checkLoadedList(PAC4Testing.java:27)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1886)

最佳答案

该错误明确表明recyclerView.getAdapter()中的getRVcount()调用返回null。这是因为即使您确实从RecyclerView recyclerView = (RecyclerView) mActivityRule.getActivity().findViewById(R.id.book_list);获取了 View ,但您获得的recyclerview与该类中的 View 也不相同,因为它是一个全新的 View ,并且没有与之关联的Adapters或LayoutManagers。结果,您无法在适配器上调用getItemCount()

由于您尚未发布类(class)代码,因此我不确定您要在此处测试什么,但是您可能需要查看以下几个链接,看看它们是否对您有帮助https://spin.atomicobject.com/2016/04/15/espresso-testing-recyclerviews/http://alexander-thiele.blogspot.in/2016/01/espresso-ui-tests-and-recyclerview.html

关于android - 在UI测试期间启动后,应用程序关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47978440/

相关文章:

更新 Android SDK 工具后 AndroidPreCompiler 构建错误

android - Android中的Qt和app数据存储

android - 显示 Instagram 缩略图的全屏图像

version-control - Gradle:Ant-wards 兼容吗?

gradle - 如何获得Gradle下载和缓存Scala编译器JAR?

arrays - 如何断言集合中的每个项目都在范围内

android - Junit 使用 ActivityInstrumentationTestCase2 - 构造函数 : Stub 中的异常

android - 从广告点击返回后 Activity 重新启动

java - 如何在没有安装 maven 和 java 的情况下从 gradle 执行 maven 插件

java - Tomcat 8.0.15 Oracle 11 数据库和 jdbc javax.naming.NamingException