API 24 中已弃用 ApplicationTestCase

33

我在Android Studio 2.1.2上创建了一个默认的空项目,使用了API 24。在示例项目中,Google提供了一个被弃用的类ApplicationTestCase

此类在API级别24中已弃用。请改用ActivityTestRule。应该使用Android Testing Support Library编写新测试。

示例:

import android.app.Application;
import android.test.ApplicationTestCase;

/**
 * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
 */
public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }
}
我的问题:为什么Android Test Case现在已被弃用?如何使用ActivityTestRule替代ApplicationTestCase?
编辑:

我尝试使用Espresso,但在compileSdkVersion 24API 24上出现了错误:

Error:Conflict with dependency 'com.android.support:appcompat-v7'. Resolved versions for app (24.0.0) and test app (23.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
Error:Conflict with dependency 'com.android.support:design'. Resolved versions for app (24.0.0) and test app (23.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
Error:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (24.0.0) and test app (23.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
Error:Conflict with dependency 'com.android.support:recyclerview-v7'. Resolved versions for app (24.0.0) and test app (23.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.

当我尝试在我的build.gradle中添加这个库时:

// Android JUnit Runner
androidTestCompile 'com.android.support.test:runner:0.5'
// JUnit4 Rules
androidTestCompile 'com.android.support.test:rules:0.5'
// Espresso core
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2'
// Espresso-web for WebView support
androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2.2'
// Espresso-idling-resource for synchronization with background jobs
androidTestCompile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'

我的结论是,目前在 Android API 24 上,无论是Android Test Case还是Expresso都不能正常工作。这个结论正确吗?


编辑:2016-08-05

我已经修复了之前在Expresso上的错误:

def espressoVersion = '2.2.2'
def testRunnerVersion = '0.5'
androidTestCompile "com.android.support.test:rules:${testRunnerVersion}"
androidTestCompile "com.android.support.test.espresso:espresso-core:${espressoVersion}"
configurations.androidTestCompile.dependencies.each { androidTestCompileDependency ->
    androidTestCompileDependency.exclude group: 'com.android.support'
}

谷歌搜索“android espresso”。 - hanbumpark
@HanbumBak 我找不到关于Api 24的教程。 - lopez.mikhael
关于依赖冲突错误,请参见:此答案 - thaussma
3个回答

25

Android Studio 2.2 beta版本生成的新的androidTest示例如下:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("org.mypackage", appContext.getPackageName());
    }
}

就像弃用警告所建议的那样,新的仪器测试应该使用InstrumentationRegistry而不是继承自AndroidTestCase。使用AndroidJUnit4来运行它们。

build.gradle文件中相关的dependencies部分如下:

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})

3
好的,但是你需要如何替换ApplicationTestCase呢?它在每个测试用例之间处理应用程序的设置和拆卸。 - TWiStErRob
@TWiStErRob 只需在测试用例中添加一个方法,并使用 JUnit 的 @Before@After 进行注释,然后在那里执行您的设置/拆卸操作。 - friederbluemle
3
我知道,我的问题更专注于:这些方法的内容是什么,以便每次正确地创建一个新的Application实例,避免泄漏、冲突,并且在应用程序内需要使用context.getApplicationContext()获取该测试中创建的实例。 - TWiStErRob
如果我理解正确的话,您的Application类需要处理资源泄漏,无论它是否从Test类中调用。请参见下面的答案,了解如何使用它而不是ApplicationTestCase。 - MG Developer

1
正如API文档所示,该API已被弃用,应改为使用InstrumentationRegistry.getTargetContext(),这将调用您的Application类的onCreate方法。
getTargetContext将调用Android清单中定义的ApplicationStartupService类。
    <?xml version="1.0" encoding="utf-8"?>
     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       <application
           android:name=".service.ApplicationStartupService"

 public class ApplicationStartupService extends Application
 {

       /**
         * Method initializes the application configuration
       */
       @Override
       public void onCreate(){

          super.onCreate();

          this.initResources()
       }

      private void initResource(){
          //do your application init work here.
      }
}

Test Class

  @RunWith(AndroidJUnit4.class)      
  public class ApplicationStartupServiceTest {

  @Test
  public void testResourcesAreInitializedd() throws Exception {
   //do your assertions here.
  }

https://developer.android.com/reference/android/test/ApplicationTestCase


0

我可以用什么来替换它?

public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }
}


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